{"_id":"@adimm/x-injection-reactjs","_rev":"19-4812cec0241ec15a73ffdb90f579efd5","name":"@adimm/x-injection-reactjs","dist-tags":{"latest":"1.0.7"},"versions":{"0.1.0":{"name":"@adimm/x-injection-reactjs","version":"0.1.0","keywords":["inversion of control","ioc","di","dependency injection","reactjs","components","inversify","nest","ts","typescript"],"author":{"name":"Adi-Marian Mutu"},"license":"MIT","_id":"@adimm/x-injection-reactjs@0.1.0","maintainers":[{"name":"adimm","email":"mutu.adi.marian@gmail.com"}],"homepage":"https://github.com/AdiMarianMutu/x-injection-reactjs#readme","bugs":{"url":"https://github.com/AdiMarianMutu/x-injection-reactjs/issues"},"dist":{"shasum":"1ec86dd4fe4982adf6c282d0253ca2348e0e68e8","tarball":"https://registry.npmjs.org/@adimm/x-injection-reactjs/-/x-injection-reactjs-0.1.0.tgz","fileCount":9,"integrity":"sha512-fmn8Iwm8pVTw5ycMHVtj9xrTw8HDIacMa52l22jM3eo2UHTP4hCvMCLD9fSXqDRMUunQzEeqQAoYyoj8TCJAxA==","signatures":[{"sig":"MEUCIQD6du5YxEsn45QOCrOyt6w4LvOi9t2703CwhBYjJShS5AIgS3CLnlUDSQWD/G4rZddA5cKO1pFzsela5XqieY4CGkU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":95125},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"gitHead":"46d919bffa7dccf53b5b6c803e3660f92052aff9","scripts":{"lint":"eslint \"src/**/*.{ts,tsx}\" --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":"ReactJS integration of the `xInjection` library.","directories":{},"sideEffects":false,"_nodeVersion":"18.20.8","dependencies":{"react":">=18.0.0","@adimm/x-injection":"^0.4.0"},"_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","@types/react":"^19.1.2","node-notifier":"^10.0.1","@tsconfig/node18":"^18.2.4","eslint-plugin-import":"^2.31.0","@testing-library/react":"^16.3.0","eslint-config-prettier":"^9.1.0","eslint-plugin-prettier":"^5.3.1","jest-environment-jsdom":"^29.7.0","typedoc-theme-hierarchy":"^6.0.0","@testing-library/jest-dom":"^6.6.3","@typescript-eslint/eslint-plugin":"^6.21.0","@ianvs/prettier-plugin-sort-imports":"^4.4.1"},"optionalDependencies":{"@rollup/rollup-linux-x64-gnu":"4.40.2"},"_npmOperationalInternal":{"tmp":"tmp/x-injection-reactjs_0.1.0_1746735218730_0.6869333072641715","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@adimm/x-injection-reactjs","version":"0.1.1","keywords":["inversion of control","ioc","di","dependency injection","reactjs","components","inversify","nest","ts","typescript"],"author":{"name":"Adi-Marian Mutu"},"license":"MIT","_id":"@adimm/x-injection-reactjs@0.1.1","maintainers":[{"name":"adimm","email":"mutu.adi.marian@gmail.com"}],"homepage":"https://github.com/AdiMarianMutu/x-injection-reactjs#readme","bugs":{"url":"https://github.com/AdiMarianMutu/x-injection-reactjs/issues"},"dist":{"shasum":"461983b173054b3e6b7a35cce790d003764e4e0d","tarball":"https://registry.npmjs.org/@adimm/x-injection-reactjs/-/x-injection-reactjs-0.1.1.tgz","fileCount":9,"integrity":"sha512-dLc/IILm/oiO7no486knoY1GgNoW7dj5tokM8rz4vCkJpVkfypQ4pv47JUXFAUfIbeUUXaSnhTl1nSmhrGBK5A==","signatures":[{"sig":"MEQCIB5ruPOtHScJu8sopbgrqM2K3+sZuaxQBYnNGKRNjkvIAiBbTmbFgysxGCal7iw7i00vLCFp9yPQhKmCS3dtCMggDg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":96638},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"gitHead":"b3898dc4d5d09a13f522ac73fa3bde82dbe51ea9","scripts":{"lint":"eslint \"src/**/*.{ts,tsx}\" --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":"ReactJS integration of the `xInjection` library.","directories":{},"sideEffects":false,"_nodeVersion":"18.20.8","dependencies":{"react":">=18.0.0","@adimm/x-injection":"^0.4.0"},"_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","@types/react":"^19.1.2","node-notifier":"^10.0.1","@tsconfig/node18":"^18.2.4","eslint-plugin-import":"^2.31.0","@testing-library/react":"^16.3.0","eslint-config-prettier":"^9.1.0","eslint-plugin-prettier":"^5.3.1","jest-environment-jsdom":"^29.7.0","typedoc-theme-hierarchy":"^6.0.0","@testing-library/jest-dom":"^6.6.3","@typescript-eslint/eslint-plugin":"^6.21.0","@ianvs/prettier-plugin-sort-imports":"^4.4.1"},"optionalDependencies":{"@rollup/rollup-linux-x64-gnu":"4.40.2"},"_npmOperationalInternal":{"tmp":"tmp/x-injection-reactjs_0.1.1_1746741608795_0.907929565168939","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@adimm/x-injection-reactjs","version":"0.1.2","keywords":["inversion of control","ioc","di","dependency injection","reactjs","components","inversify","nest","ts","typescript"],"author":{"name":"Adi-Marian Mutu"},"license":"MIT","_id":"@adimm/x-injection-reactjs@0.1.2","maintainers":[{"name":"adimm","email":"mutu.adi.marian@gmail.com"}],"homepage":"https://github.com/AdiMarianMutu/x-injection-reactjs#readme","bugs":{"url":"https://github.com/AdiMarianMutu/x-injection-reactjs/issues"},"dist":{"shasum":"1d10c0d70b9c8304a4382728eba171b9ca344bbb","tarball":"https://registry.npmjs.org/@adimm/x-injection-reactjs/-/x-injection-reactjs-0.1.2.tgz","fileCount":9,"integrity":"sha512-agUz/09g+MdKQYsgM/89s1bJOB0zz4HYxom2IR6+LIoL8e6Olt/9cqaHVjx1Lul4NPXohF6L1kaKxp1ZNP5d1Q==","signatures":[{"sig":"MEUCIQCV7RQDEzmFTgEs+XNOiQIRX9soyRfNjx1tk/ElgXwAgwIgLEkuIqzAcBKrEIU8QW4eM4f4qFxX9XLBmvB+uhPavac=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":95058},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"gitHead":"47213e7a88a1e2ca9e0aaab2c1c2381fd38fdb39","scripts":{"lint":"eslint \"src/**/*.{ts,tsx}\" --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":"ReactJS integration of the `xInjection` library.","directories":{},"sideEffects":false,"_nodeVersion":"18.20.8","dependencies":{"react":">=18.0.0","@adimm/x-injection":"^0.4.0"},"_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","@types/react":"^19.1.2","node-notifier":"^10.0.1","@tsconfig/node18":"^18.2.4","eslint-plugin-import":"^2.31.0","@testing-library/react":"^16.3.0","eslint-config-prettier":"^9.1.0","eslint-plugin-prettier":"^5.3.1","jest-environment-jsdom":"^29.7.0","typedoc-theme-hierarchy":"^6.0.0","@testing-library/jest-dom":"^6.6.3","@typescript-eslint/eslint-plugin":"^6.21.0","@ianvs/prettier-plugin-sort-imports":"^4.4.1"},"optionalDependencies":{"@rollup/rollup-linux-x64-gnu":"4.40.2"},"_npmOperationalInternal":{"tmp":"tmp/x-injection-reactjs_0.1.2_1746774940166_0.9571049233542046","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@adimm/x-injection-reactjs","version":"0.2.0","keywords":["inversion of control","ioc","di","dependency injection","reactjs","components","inversify","nest","ts","typescript"],"author":{"name":"Adi-Marian Mutu"},"license":"MIT","_id":"@adimm/x-injection-reactjs@0.2.0","maintainers":[{"name":"adimm","email":"mutu.adi.marian@gmail.com"}],"homepage":"https://github.com/AdiMarianMutu/x-injection-reactjs#readme","bugs":{"url":"https://github.com/AdiMarianMutu/x-injection-reactjs/issues"},"dist":{"shasum":"80db32aae624e64a235930df4b853fc7ac14470d","tarball":"https://registry.npmjs.org/@adimm/x-injection-reactjs/-/x-injection-reactjs-0.2.0.tgz","fileCount":9,"integrity":"sha512-JiHzhr1EHJwfgAP/fWcOVP8xwJ9MoT6zoy3pWjd99OXUlr2J7ynxLJ6u5tifAIAUwj36IiMkMPY8QZzNNZJJfg==","signatures":[{"sig":"MEYCIQCDZKEG8QfKdam/4qfQuHvASminWR5OS3EVo+hurzeh0AIhAORUNKkzC0T7p+oCC/tCbxuEi1cmGJqeV0AdD6QpHGp5","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":84115},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"gitHead":"fb93b7aea642af320c45eb32f80c466fd51e1a5c","scripts":{"lint":"eslint \"src/**/*.{ts,tsx}\" --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":"ReactJS integration of the `xInjection` library.","directories":{},"sideEffects":false,"_nodeVersion":"18.20.8","dependencies":{"react":">=18.0.0","@adimm/x-injection":"^0.5.1"},"_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","@types/react":"^19.1.2","node-notifier":"^10.0.1","@tsconfig/node18":"^18.2.4","eslint-plugin-import":"^2.31.0","@testing-library/react":"^16.3.0","eslint-config-prettier":"^9.1.0","eslint-plugin-prettier":"^5.3.1","jest-environment-jsdom":"^29.7.0","typedoc-theme-hierarchy":"^6.0.0","@testing-library/jest-dom":"^6.6.3","@typescript-eslint/eslint-plugin":"^6.21.0","@ianvs/prettier-plugin-sort-imports":"^4.4.1"},"optionalDependencies":{"@rollup/rollup-linux-x64-gnu":"4.40.2"},"_npmOperationalInternal":{"tmp":"tmp/x-injection-reactjs_0.2.0_1747011284689_0.5216827303841638","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@adimm/x-injection-reactjs","version":"0.2.1","keywords":["inversion of control","ioc","di","dependency injection","reactjs","components","inversify","nest","ts","typescript"],"author":{"name":"Adi-Marian Mutu"},"license":"MIT","_id":"@adimm/x-injection-reactjs@0.2.1","maintainers":[{"name":"adimm","email":"mutu.adi.marian@gmail.com"}],"homepage":"https://github.com/AdiMarianMutu/x-injection-reactjs#readme","bugs":{"url":"https://github.com/AdiMarianMutu/x-injection-reactjs/issues"},"dist":{"shasum":"5fcbc395b9f7306040f86034b6916930730b3e40","tarball":"https://registry.npmjs.org/@adimm/x-injection-reactjs/-/x-injection-reactjs-0.2.1.tgz","fileCount":9,"integrity":"sha512-kp3UC0PB8fvGK9EoLI0UxBsQNAlVy3ufHL5e4lnTQXdThrIgc28hEks03uz02JwcDbQv5b7FDcChPNF2kV/iKA==","signatures":[{"sig":"MEYCIQDKaEdKTGChkAffIS3QvrYWGQLudnEkh566hNCX7zcaiAIhALUMIigTdPXhqWF3uM11utN1gt0BweLXKy3biMBfw48x","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":85371},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"gitHead":"83eaa1d258661fc0f2c9089a48fe382f9cfae5a8","scripts":{"lint":"eslint \"src/**/*.{ts,tsx}\" --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":"ReactJS integration of the `xInjection` library.","directories":{},"sideEffects":false,"_nodeVersion":"18.20.8","dependencies":{"react":">=18.0.0","@adimm/x-injection":"^0.5.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","@types/react":"^19.1.2","node-notifier":"^10.0.1","@tsconfig/node18":"^18.2.4","eslint-plugin-import":"^2.31.0","@testing-library/react":"^16.3.0","eslint-config-prettier":"^9.1.0","eslint-plugin-prettier":"^5.3.1","jest-environment-jsdom":"^29.7.0","typedoc-theme-hierarchy":"^6.0.0","@testing-library/jest-dom":"^6.6.3","@typescript-eslint/eslint-plugin":"^6.21.0","@ianvs/prettier-plugin-sort-imports":"^4.4.1"},"optionalDependencies":{"@rollup/rollup-linux-x64-gnu":"4.40.2"},"_npmOperationalInternal":{"tmp":"tmp/x-injection-reactjs_0.2.1_1747131069034_0.30374109824992956","host":"s3://npm-registry-packages-npm-production"}},"0.2.2":{"name":"@adimm/x-injection-reactjs","version":"0.2.2","keywords":["inversion of control","ioc","di","dependency injection","reactjs","components","inversify","nest","ts","typescript"],"author":{"name":"Adi-Marian Mutu"},"license":"MIT","_id":"@adimm/x-injection-reactjs@0.2.2","maintainers":[{"name":"adimm","email":"mutu.adi.marian@gmail.com"}],"homepage":"https://github.com/AdiMarianMutu/x-injection-reactjs#readme","bugs":{"url":"https://github.com/AdiMarianMutu/x-injection-reactjs/issues"},"dist":{"shasum":"4ef8b63f585c61587d3bc3ebc684ae482eb65316","tarball":"https://registry.npmjs.org/@adimm/x-injection-reactjs/-/x-injection-reactjs-0.2.2.tgz","fileCount":9,"integrity":"sha512-w5Cp3bL5XPebpQ9hN3pTjk2dd7nPScwCpjVMvLpZqKcqytZKxa/AFfn1U0jlUjl16p350A0XqBFDPDLAEWnnmQ==","signatures":[{"sig":"MEUCIQD7Y+KqY9x0iEb8PtL2FPlTjAbCg0+fI78MQ9ytstGJeAIgbJLMz9JUilb2uU4KcZMDc5t6PMRtBtKJIAX7SDUQ78w=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":87879},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"gitHead":"47291bad1feb8a8c18210806e2281eeafae06779","scripts":{"lint":"eslint \"src/**/*.{ts,tsx}\" --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":"ReactJS integration of the `xInjection` library.","directories":{},"sideEffects":false,"_nodeVersion":"18.20.8","dependencies":{"react":">=18.0.0","@adimm/x-injection":"^0.6.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","@types/react":"^19.1.2","node-notifier":"^10.0.1","@tsconfig/node18":"^18.2.4","eslint-plugin-import":"^2.31.0","@testing-library/react":"^16.3.0","eslint-config-prettier":"^9.1.0","eslint-plugin-prettier":"^5.3.1","jest-environment-jsdom":"^29.7.0","typedoc-theme-hierarchy":"^6.0.0","@testing-library/jest-dom":"^6.6.3","@typescript-eslint/eslint-plugin":"^6.21.0","@ianvs/prettier-plugin-sort-imports":"^4.4.1"},"optionalDependencies":{"@rollup/rollup-linux-x64-gnu":"4.40.2"},"_npmOperationalInternal":{"tmp":"tmp/x-injection-reactjs_0.2.2_1747178130424_0.8305754537056287","host":"s3://npm-registry-packages-npm-production"}},"0.2.3":{"name":"@adimm/x-injection-reactjs","version":"0.2.3","keywords":["inversion of control","ioc","di","dependency injection","reactjs","components","inversify","nest","ts","typescript"],"author":{"name":"Adi-Marian Mutu"},"license":"MIT","_id":"@adimm/x-injection-reactjs@0.2.3","maintainers":[{"name":"adimm","email":"mutu.adi.marian@gmail.com"}],"homepage":"https://github.com/AdiMarianMutu/x-injection-reactjs#readme","bugs":{"url":"https://github.com/AdiMarianMutu/x-injection-reactjs/issues"},"dist":{"shasum":"a27d32f3e5b6d7dbeddec89d20fc479a9bf30992","tarball":"https://registry.npmjs.org/@adimm/x-injection-reactjs/-/x-injection-reactjs-0.2.3.tgz","fileCount":9,"integrity":"sha512-gyDOfvV6ZH+qqK05fy38ENHeQ12Q1s9q0nqQnbMs7eusLUAsTPbMyyQljelOKDsVzdA2YQ1AW191S2N8j3tNZA==","signatures":[{"sig":"MEYCIQCZtz86UoBCwXaVvYAwvaOPZ0YYbcnflkpmF9m1epu3WAIhAJwH8JAZV18C4VnZYncWbRNXcWxhGDK9e4qDfoIUdGQm","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":87879},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"gitHead":"75b661789b97e9126b8059c3093bc259c2a2a1b6","scripts":{"lint":"eslint \"src/**/*.{ts,tsx}\" --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":"ReactJS integration of the `xInjection` library.","directories":{},"sideEffects":false,"_nodeVersion":"18.20.8","dependencies":{"react":">=18.0.0","@adimm/x-injection":"^0.6.3"},"_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","@types/react":"^19.1.2","node-notifier":"^10.0.1","@tsconfig/node18":"^18.2.4","eslint-plugin-import":"^2.31.0","@testing-library/react":"^16.3.0","eslint-config-prettier":"^9.1.0","eslint-plugin-prettier":"^5.3.1","jest-environment-jsdom":"^29.7.0","typedoc-theme-hierarchy":"^6.0.0","@testing-library/jest-dom":"^6.6.3","@typescript-eslint/eslint-plugin":"^6.21.0","@ianvs/prettier-plugin-sort-imports":"^4.4.1"},"optionalDependencies":{"@rollup/rollup-linux-x64-gnu":"4.40.2"},"_npmOperationalInternal":{"tmp":"tmp/x-injection-reactjs_0.2.3_1747181825692_0.32023337654569173","host":"s3://npm-registry-packages-npm-production"}},"0.2.4":{"name":"@adimm/x-injection-reactjs","version":"0.2.4","keywords":["inversion of control","ioc","di","dependency injection","reactjs","components","inversify","nest","ts","typescript"],"author":{"name":"Adi-Marian Mutu"},"license":"MIT","_id":"@adimm/x-injection-reactjs@0.2.4","maintainers":[{"name":"adimm","email":"mutu.adi.marian@gmail.com"}],"homepage":"https://github.com/AdiMarianMutu/x-injection-reactjs#readme","bugs":{"url":"https://github.com/AdiMarianMutu/x-injection-reactjs/issues"},"dist":{"shasum":"2974851ff3b542552895a164d82f98e2904271b6","tarball":"https://registry.npmjs.org/@adimm/x-injection-reactjs/-/x-injection-reactjs-0.2.4.tgz","fileCount":9,"integrity":"sha512-1Apm2YdIBld3mqTqXrst72lWQ0DSPq/XLAzMn7gsTY4yZKxMYhKQ4neMMrngZlX29IqnrTxk3x6DwsNnGKnAsg==","signatures":[{"sig":"MEUCIQD3Xmds6NxrLKHGFqT2Kc5emJlo7SsKQxp+3RmgbzP7/gIgPh422moaI7zWGEslxSVg5gB8mDNn/IT/g8Cfyh7Mui8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":87835},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"gitHead":"ab85a6460bd776fbd548430280e6681828d0754e","scripts":{"lint":"eslint \"src/**/*.{ts,tsx}\" --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","update-base-lib":"npm i @adimm/x-injection@latest & git add package.json package-lock.json & git commit -m \"chore: install latest version of the `xInjection` base lib\""},"_npmUser":{"name":"adimm","email":"mutu.adi.marian@gmail.com"},"_npmVersion":"10.8.2","description":"ReactJS integration of the `xInjection` library.","directories":{},"sideEffects":false,"_nodeVersion":"18.20.8","dependencies":{"react":">=18.0.0","@adimm/x-injection":"^0.6.4"},"_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","@types/react":"^19.1.2","node-notifier":"^10.0.1","@tsconfig/node18":"^18.2.4","eslint-plugin-import":"^2.31.0","@testing-library/react":"^16.3.0","eslint-config-prettier":"^9.1.0","eslint-plugin-prettier":"^5.3.1","jest-environment-jsdom":"^29.7.0","typedoc-theme-hierarchy":"^6.0.0","@testing-library/jest-dom":"^6.6.3","@typescript-eslint/eslint-plugin":"^6.21.0","@ianvs/prettier-plugin-sort-imports":"^4.4.1"},"optionalDependencies":{"@rollup/rollup-linux-x64-gnu":"4.40.2"},"_npmOperationalInternal":{"tmp":"tmp/x-injection-reactjs_0.2.4_1747227152305_0.5126263251377476","host":"s3://npm-registry-packages-npm-production"}},"0.2.5":{"name":"@adimm/x-injection-reactjs","version":"0.2.5","keywords":["inversion of control","ioc","di","dependency injection","reactjs","components","inversify","nest","ts","typescript"],"author":{"name":"Adi-Marian Mutu"},"license":"MIT","_id":"@adimm/x-injection-reactjs@0.2.5","maintainers":[{"name":"adimm","email":"mutu.adi.marian@gmail.com"}],"homepage":"https://github.com/AdiMarianMutu/x-injection-reactjs#readme","bugs":{"url":"https://github.com/AdiMarianMutu/x-injection-reactjs/issues"},"dist":{"shasum":"4b57620ac33dd7d2eb8527d603fcaa39b51e1750","tarball":"https://registry.npmjs.org/@adimm/x-injection-reactjs/-/x-injection-reactjs-0.2.5.tgz","fileCount":9,"integrity":"sha512-lsi3APSBUl2dZc1ZWujnYga0V/Pq0EfYdngmfvfWImMFhLZ19VTgVifT2w0aFPBNpiLtDloP/PLffOrN8khUvQ==","signatures":[{"sig":"MEUCIQCTHPE1gBb0GUfzJjG+asdKYoWP0pd+rElIYgfUpwDQAAIgUhVYk1PuKkwzoOmOgOm7+DyxWd2VdweWqYQJ4pJWkfo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":87835},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"gitHead":"1cd4b5c4b35a42cd78f57d14644996874ba30056","scripts":{"lint":"eslint \"src/**/*.{ts,tsx}\" --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","update-base-lib":"npm i @adimm/x-injection@latest & git add package.json package-lock.json & git commit -m \"chore: install latest version of the `xInjection` base lib\""},"_npmUser":{"name":"adimm","email":"mutu.adi.marian@gmail.com"},"_npmVersion":"10.8.2","description":"ReactJS integration of the `xInjection` library.","directories":{},"sideEffects":false,"_nodeVersion":"18.20.8","dependencies":{"react":">=18.0.0","@adimm/x-injection":"^0.6.5"},"_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","@types/react":"^19.1.2","node-notifier":"^10.0.1","@tsconfig/node18":"^18.2.4","eslint-plugin-import":"^2.31.0","@testing-library/react":"^16.3.0","eslint-config-prettier":"^9.1.0","eslint-plugin-prettier":"^5.3.1","jest-environment-jsdom":"^29.7.0","typedoc-theme-hierarchy":"^6.0.0","@testing-library/jest-dom":"^6.6.3","@typescript-eslint/eslint-plugin":"^6.21.0","@ianvs/prettier-plugin-sort-imports":"^4.4.1"},"optionalDependencies":{"@rollup/rollup-linux-x64-gnu":"4.40.2"},"_npmOperationalInternal":{"tmp":"tmp/x-injection-reactjs_0.2.5_1747237327123_0.893739334899949","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@adimm/x-injection-reactjs","version":"0.3.0","keywords":["inversion of control","ioc","di","dependency injection","reactjs","components","inversify","nest","ts","typescript"],"author":{"name":"Adi-Marian Mutu"},"license":"MIT","_id":"@adimm/x-injection-reactjs@0.3.0","maintainers":[{"name":"adimm","email":"mutu.adi.marian@gmail.com"}],"homepage":"https://github.com/AdiMarianMutu/x-injection-reactjs#readme","bugs":{"url":"https://github.com/AdiMarianMutu/x-injection-reactjs/issues"},"dist":{"shasum":"b23c1a5169e2f9b475c06cc97db369e1dfd2a995","tarball":"https://registry.npmjs.org/@adimm/x-injection-reactjs/-/x-injection-reactjs-0.3.0.tgz","fileCount":9,"integrity":"sha512-4QPBsIS3E0wEYOOmSG9MxQM+tI2Qnxr5GPESuognPX9ZAPXYaxX0FzUB4X+dhmCyUCseVSDyTw4IKcbLKtcBkg==","signatures":[{"sig":"MEUCIEYbdzlxNQkTU7JRAloluhD8NjHXM/ha+KFGjeUjO9elAiEAhhrutU8VcSCFj+zgJDKNte7MeRAsK6RgCupAHlref48=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":99400},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"gitHead":"1e57ace276b503b089ea04fc0b2a7fa58efc2aa4","scripts":{"lint":"eslint \"src/**/*.{ts,tsx}\" --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","update-base-lib":"npm i @adimm/x-injection@latest & git add package.json package-lock.json & git commit -m \"chore: install latest version of the `xInjection` base lib\""},"_npmUser":{"name":"adimm","email":"mutu.adi.marian@gmail.com"},"_npmVersion":"10.8.2","description":"ReactJS integration of the `xInjection` library.","directories":{},"sideEffects":false,"_nodeVersion":"18.20.8","dependencies":{"react":">=18.0.0","@adimm/x-injection":"^0.7.0"},"_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","@types/react":"^19.1.2","node-notifier":"^10.0.1","@tsconfig/node18":"^18.2.4","eslint-plugin-import":"^2.31.0","@testing-library/react":"^16.3.0","eslint-config-prettier":"^9.1.0","eslint-plugin-prettier":"^5.3.1","jest-environment-jsdom":"^29.7.0","typedoc-theme-hierarchy":"^6.0.0","@testing-library/jest-dom":"^6.6.3","@typescript-eslint/eslint-plugin":"^6.21.0","@ianvs/prettier-plugin-sort-imports":"^4.4.1"},"optionalDependencies":{"@rollup/rollup-linux-x64-gnu":"4.40.2"},"_npmOperationalInternal":{"tmp":"tmp/x-injection-reactjs_0.3.0_1747437144667_0.5819730186494037","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"@adimm/x-injection-reactjs","version":"0.3.1","keywords":["inversion of control","ioc","di","dependency injection","reactjs","components","inversify","nest","ts","typescript"],"author":{"name":"Adi-Marian Mutu"},"license":"MIT","_id":"@adimm/x-injection-reactjs@0.3.1","maintainers":[{"name":"adimm","email":"mutu.adi.marian@gmail.com"}],"homepage":"https://github.com/AdiMarianMutu/x-injection-reactjs#readme","bugs":{"url":"https://github.com/AdiMarianMutu/x-injection-reactjs/issues"},"dist":{"shasum":"985ac6977f752da4db6850736335c6612c43ca65","tarball":"https://registry.npmjs.org/@adimm/x-injection-reactjs/-/x-injection-reactjs-0.3.1.tgz","fileCount":9,"integrity":"sha512-z+CPbWbDj3UtJTILVjtu/f7hlAk4Eh0skhiLIZynDnnGoTDTYsZyjYGlEKNKzPGpxMV4t6K4rSrZQyjxkLvDzg==","signatures":[{"sig":"MEQCIEiwfvU67rYGu6puI2XmqNhlH/vFLO3DUaj8hGamDTM2AiAePXmTRZB6iyp1VcAP1b0Q4/8hGojLDT3ncMNT2tGjcA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":107528},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"gitHead":"126812dd5d00113327b273b0612ae7cafe0c29a4","scripts":{"lint":"eslint \"src/**/*.{ts,tsx}\" --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","update-base-lib":"npm i @adimm/x-injection@latest & git add package.json package-lock.json & git commit -m \"chore: install latest version of the `xInjection` base lib\""},"_npmUser":{"name":"adimm","email":"mutu.adi.marian@gmail.com"},"_npmVersion":"10.8.2","description":"ReactJS integration of the `xInjection` library.","directories":{},"sideEffects":false,"_nodeVersion":"18.20.8","dependencies":{"react":">=18.0.0","@adimm/x-injection":"^0.8.0"},"_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","@types/react":"^19.1.2","node-notifier":"^10.0.1","@tsconfig/node18":"^18.2.4","eslint-plugin-import":"^2.31.0","@testing-library/react":"^16.3.0","eslint-config-prettier":"^9.1.0","eslint-plugin-prettier":"^5.3.1","jest-environment-jsdom":"^29.7.0","typedoc-theme-hierarchy":"^6.0.0","@testing-library/jest-dom":"^6.6.3","@typescript-eslint/eslint-plugin":"^6.21.0","@ianvs/prettier-plugin-sort-imports":"^4.4.1"},"optionalDependencies":{"@rollup/rollup-linux-x64-gnu":"4.40.2"},"_npmOperationalInternal":{"tmp":"tmp/x-injection-reactjs_0.3.1_1747595186318_0.48665297427060716","host":"s3://npm-registry-packages-npm-production"}},"1.0.0":{"name":"@adimm/x-injection-reactjs","version":"1.0.0","keywords":["inversion of control","ioc","di","dependency injection","reactjs","components","inversify","nest","ts","typescript"],"author":{"name":"Adi-Marian Mutu"},"license":"MIT","_id":"@adimm/x-injection-reactjs@1.0.0","maintainers":[{"name":"adimm","email":"mutu.adi.marian@gmail.com"}],"homepage":"https://github.com/AdiMarianMutu/x-injection-reactjs#readme","bugs":{"url":"https://github.com/AdiMarianMutu/x-injection-reactjs/issues"},"dist":{"shasum":"853a2f99b359f24853d1955f7dc4bbdd9cb667a1","tarball":"https://registry.npmjs.org/@adimm/x-injection-reactjs/-/x-injection-reactjs-1.0.0.tgz","fileCount":9,"integrity":"sha512-/m5SlW/8dJFSHHfYJxPdT4rsWTYMe2JrtqK/RkUlNhAyazq+2tBJg1mfV85lvoHXCAQk4yH/2j1DgGQceiNkTw==","signatures":[{"sig":"MEUCIHGB925d+9H4JuRum7aA5EWseRpP1XTFG19lw/4NBvXhAiEAjymsxKDmsDSEDI5puHTr1a24jnr1Bnp4+j1h+A1uPEo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":74430},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=22.0.0"},"gitHead":"f982405d67f16325b4e3fa4ddaa5027689bdc9d1","scripts":{"lint":"eslint \"src/**/*.{ts,tsx}\" --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","update-base-lib":"npm i @adimm/x-injection@latest & git add package.json package-lock.json & git commit -m \"chore: install latest version of the `xInjection` base lib\""},"_npmUser":{"name":"adimm","actor":{"name":"adimm","type":"user","email":"mutu.adi.marian@gmail.com"},"email":"mutu.adi.marian@gmail.com"},"_npmVersion":"10.8.2","description":"ReactJS integration of the `xInjection` library.","directories":{},"sideEffects":false,"_nodeVersion":"18.20.8","dependencies":{"react":">=18.0.0","@adimm/x-injection":"^2.1.0"},"_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","@types/react":"^19.1.2","node-notifier":"^10.0.1","@tsconfig/node22":"^22.0.2","eslint-plugin-import":"^2.31.0","@testing-library/react":"^16.3.0","eslint-config-prettier":"^10.1.5","eslint-plugin-prettier":"^5.3.1","jest-environment-jsdom":"^30.0.0","typedoc-theme-hierarchy":"^6.0.0","@testing-library/jest-dom":"^6.6.3","@typescript-eslint/eslint-plugin":"^8.34.1","@ianvs/prettier-plugin-sort-imports":"^4.4.2"},"optionalDependencies":{"@rollup/rollup-linux-x64-gnu":"^4.43.0"},"_npmOperationalInternal":{"tmp":"tmp/x-injection-reactjs_1.0.0_1750278534461_0.4370494924709738","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@adimm/x-injection-reactjs","version":"1.0.1","keywords":["inversion of control","ioc","di","dependency injection","reactjs","components","inversify","nest","ts","typescript"],"author":{"name":"Adi-Marian Mutu"},"license":"MIT","_id":"@adimm/x-injection-reactjs@1.0.1","maintainers":[{"name":"adimm","email":"mutu.adi.marian@gmail.com"}],"homepage":"https://github.com/AdiMarianMutu/x-injection-reactjs#readme","bugs":{"url":"https://github.com/AdiMarianMutu/x-injection-reactjs/issues"},"dist":{"shasum":"1e087dfae13eb3e65bef96805434fbb089600a90","tarball":"https://registry.npmjs.org/@adimm/x-injection-reactjs/-/x-injection-reactjs-1.0.1.tgz","fileCount":7,"integrity":"sha512-DuNVM57gpAhN7MgySyPo6l1+vAC//htLHA4snIZD6UMUEpuQvXmUm7reWHX4zJ+gL5zRWQnED6hpzW+cXpFeUQ==","signatures":[{"sig":"MEUCIQDUie3+8EhDhkrT090KSUuVh+/AjyK3G6PLBz9Q55ortgIgStWQXn2PCRjG6sEA7ewEyYhkB0V+m/8EatvRuOX6P64=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":44822},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=22.0.0"},"gitHead":"dc73d7a69b631235cf7960c89c7a84c0ace97b18","scripts":{"lint":"eslint \"src/**/*.{ts,tsx}\" --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","update-base-lib":"npm i @adimm/x-injection@latest & git add package.json package-lock.json & git commit -m \"chore: install latest version of the `xInjection` base lib\""},"_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":"ReactJS integration of the `xInjection` library.","directories":{},"sideEffects":false,"_nodeVersion":"22.16.0","dependencies":{"react":">=18.0.0","@adimm/x-injection":"^2.1.0"},"_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","@types/react":"^19.1.2","node-notifier":"^10.0.1","@tsconfig/node22":"^22.0.2","eslint-plugin-import":"^2.31.0","@testing-library/react":"^16.3.0","eslint-config-prettier":"^10.1.5","eslint-plugin-prettier":"^5.3.1","jest-environment-jsdom":"^30.0.0","typedoc-theme-hierarchy":"^6.0.0","@testing-library/jest-dom":"^6.6.3","@typescript-eslint/eslint-plugin":"^8.34.1","@ianvs/prettier-plugin-sort-imports":"^4.4.2"},"optionalDependencies":{"@rollup/rollup-linux-x64-gnu":"^4.43.0"},"_npmOperationalInternal":{"tmp":"tmp/x-injection-reactjs_1.0.1_1750406787548_0.8877521575897538","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@adimm/x-injection-reactjs","version":"1.0.2","keywords":["inversion of control","ioc","di","dependency injection","reactjs","components","inversify","nest","ts","typescript"],"author":{"name":"Adi-Marian Mutu"},"license":"MIT","_id":"@adimm/x-injection-reactjs@1.0.2","maintainers":[{"name":"adimm","email":"mutu.adi.marian@gmail.com"}],"homepage":"https://github.com/AdiMarianMutu/x-injection-reactjs#readme","bugs":{"url":"https://github.com/AdiMarianMutu/x-injection-reactjs/issues"},"dist":{"shasum":"515276d87ddd334eff54ea0e24e9cef94a8308c7","tarball":"https://registry.npmjs.org/@adimm/x-injection-reactjs/-/x-injection-reactjs-1.0.2.tgz","fileCount":7,"integrity":"sha512-XqyxinvxfARfxI8aM+JiYuU5/37mRrqHERn7ko4Ix0Th18KElprXP9z0w44bMtLcIPfImX+eFyneLG2N2h1ERA==","signatures":[{"sig":"MEQCIC0r9/n5tremGmjxXcdvOa17USC4SE2cJ7aqtqPzQ5dvAiBnVlyB7zJ9bFTlsY7M6KkbVjWB6mk5QAUVp+qI+U/naw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":44949},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=22.0.0"},"gitHead":"0fe143864aefb20883d33d548e499b3623b61e9b","scripts":{"lint":"eslint \"src/**/*.{ts,tsx}\" --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","update-base-lib":"npm i @adimm/x-injection@latest & git add package.json package-lock.json & git commit -m \"chore: install latest version of the `xInjection` base lib\""},"_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":"ReactJS integration of the `xInjection` library.","directories":{},"sideEffects":false,"_nodeVersion":"22.16.0","dependencies":{"react":">=18.0.0","@adimm/x-injection":"^2.1.0"},"_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","@types/react":"^19.1.2","node-notifier":"^10.0.1","@tsconfig/node22":"^22.0.2","eslint-plugin-import":"^2.31.0","@testing-library/react":"^16.3.0","eslint-config-prettier":"^10.1.5","eslint-plugin-prettier":"^5.3.1","jest-environment-jsdom":"^30.0.0","typedoc-theme-hierarchy":"^6.0.0","@testing-library/jest-dom":"^6.6.3","@typescript-eslint/eslint-plugin":"^8.34.1","@ianvs/prettier-plugin-sort-imports":"^4.4.2"},"optionalDependencies":{"@rollup/rollup-linux-x64-gnu":"^4.43.0"},"_npmOperationalInternal":{"tmp":"tmp/x-injection-reactjs_1.0.2_1751206108621_0.47884588192929023","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"@adimm/x-injection-reactjs","version":"1.0.3","keywords":["inversion of control","ioc","di","dependency injection","reactjs","components","inversify","nest","ts","typescript"],"author":{"name":"Adi-Marian Mutu"},"license":"MIT","_id":"@adimm/x-injection-reactjs@1.0.3","maintainers":[{"name":"adimm","email":"mutu.adi.marian@gmail.com"}],"homepage":"https://github.com/AdiMarianMutu/x-injection-reactjs#readme","bugs":{"url":"https://github.com/AdiMarianMutu/x-injection-reactjs/issues"},"dist":{"shasum":"91506530808e7fac09f9c6056ceea340d8f40400","tarball":"https://registry.npmjs.org/@adimm/x-injection-reactjs/-/x-injection-reactjs-1.0.3.tgz","fileCount":7,"integrity":"sha512-xId2AGydp+94o8PBZqDlj3PwmMNZOgSp4LvBG9D/DLDtKnEr1E7XNU7DXJSTL9AgziKKmV3Pu4IwiL8euoWhWQ==","signatures":[{"sig":"MEQCIGY7QrTZcWJcrkTyP2vrcD/lkzMhuaqJ1dMmCfTEwjxkAiBfxPoIWO0tJJYEOW3tL4yNqBvtstLSd1nlE6h9E30PmQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@adimm%2fx-injection-reactjs@1.0.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":36401},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=22.0.0"},"gitHead":"ca5b73bc453a29487cdaf38eed74e08391a85942","private":false,"scripts":{"lint":"eslint \"src/**/*.{ts,tsx}\" --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","update-base-lib":"npm i @adimm/x-injection@latest & git add package.json package-lock.json & git commit -m \"chore: install latest version of the `xInjection` base lib\""},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:476c6115-1dfd-4e0a-af56-96eab6401f53"}},"repository":{"url":"git+https://github.com/AdiMarianMutu/x-injection-reactjs.git"},"_npmVersion":"11.9.0","description":"ReactJS integration of the `xInjection` library.","directories":{},"sideEffects":false,"_nodeVersion":"22.22.0","dependencies":{"react":">=18.0.0","@adimm/x-injection":"^3.0.0"},"_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","@types/react":"^19.1.2","node-notifier":"^10.0.1","@tsconfig/node22":"^22.0.2","eslint-plugin-import":"^2.31.0","@testing-library/react":"^16.3.0","eslint-config-prettier":"^10.1.5","eslint-plugin-prettier":"^5.3.1","jest-environment-jsdom":"^30.0.0","typedoc-theme-hierarchy":"^6.0.0","@testing-library/jest-dom":"^6.6.3","@typescript-eslint/eslint-plugin":"^8.34.1","@ianvs/prettier-plugin-sort-imports":"^4.4.2"},"optionalDependencies":{"@rollup/rollup-linux-x64-gnu":"^4.43.0"},"_npmOperationalInternal":{"tmp":"tmp/x-injection-reactjs_1.0.3_1770568673154_0.1389332403417296","host":"s3://npm-registry-packages-npm-production"}},"1.0.4":{"name":"@adimm/x-injection-reactjs","version":"1.0.4","keywords":["inversion of control","ioc","di","dependency injection","reactjs","components","inversify","nest","ts","typescript"],"author":{"name":"Adi-Marian Mutu"},"license":"MIT","_id":"@adimm/x-injection-reactjs@1.0.4","maintainers":[{"name":"adimm","email":"mutu.adi.marian@gmail.com"}],"homepage":"https://github.com/AdiMarianMutu/x-injection-reactjs#readme","bugs":{"url":"https://github.com/AdiMarianMutu/x-injection-reactjs/issues"},"dist":{"shasum":"63185614dc920097965911d6fc08324c36c3b388","tarball":"https://registry.npmjs.org/@adimm/x-injection-reactjs/-/x-injection-reactjs-1.0.4.tgz","fileCount":7,"integrity":"sha512-s7TvyoGeOpHJvlwcTON5VVLAl4wcazDUDYbF9h5IWYDmirGRGA4ul4N5JYQqOyUuZpnhdBRRJ4WhkKyv/pJjUQ==","signatures":[{"sig":"MEYCIQCUi2S4PnJGhV5MM8IL7q9d93p1S86GyWiysq6CChbyAgIhAMmwh3WLEH/TXEWDOfKK49P+bvsLOjY6cuC06NcOCv7E","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@adimm%2fx-injection-reactjs@1.0.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":38463},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=22.0.0"},"gitHead":"b462103ceb50bd7b3de9188f9d10e9a4b6c66402","private":false,"scripts":{"lint":"eslint \"src/**/*.{ts,tsx}\" --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","update-base-lib":"npm i @adimm/x-injection@latest & git add package.json package-lock.json & git commit -m \"chore: install latest version of the `xInjection` base lib\""},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:476c6115-1dfd-4e0a-af56-96eab6401f53"}},"repository":{"url":"git+https://github.com/AdiMarianMutu/x-injection-reactjs.git"},"_npmVersion":"11.9.0","description":"ReactJS integration of the `xInjection` library.","directories":{},"sideEffects":false,"_nodeVersion":"22.22.0","dependencies":{"react":">=18.0.0","@adimm/x-injection":"^3.0.0"},"_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","@types/react":"^19.1.2","node-notifier":"^10.0.1","@tsconfig/node22":"^22.0.2","eslint-plugin-import":"^2.31.0","@testing-library/react":"^16.3.0","eslint-config-prettier":"^10.1.5","eslint-plugin-prettier":"^5.3.1","jest-environment-jsdom":"^30.0.0","typedoc-theme-hierarchy":"^6.0.0","@testing-library/jest-dom":"^6.6.3","@typescript-eslint/eslint-plugin":"^8.34.1","@ianvs/prettier-plugin-sort-imports":"^4.4.2"},"optionalDependencies":{"@rollup/rollup-linux-x64-gnu":"^4.43.0"},"_npmOperationalInternal":{"tmp":"tmp/x-injection-reactjs_1.0.4_1770585712759_0.5521552735893169","host":"s3://npm-registry-packages-npm-production"}},"1.0.5":{"name":"@adimm/x-injection-reactjs","version":"1.0.5","keywords":["inversion of control","ioc","di","dependency injection","reactjs","components","inversify","nest","ts","typescript"],"author":{"name":"Adi-Marian Mutu"},"license":"MIT","_id":"@adimm/x-injection-reactjs@1.0.5","maintainers":[{"name":"adimm","email":"mutu.adi.marian@gmail.com"}],"homepage":"https://github.com/AdiMarianMutu/x-injection-reactjs#readme","bugs":{"url":"https://github.com/AdiMarianMutu/x-injection-reactjs/issues"},"dist":{"shasum":"eb1ff5842c6c07dcae63514a34441d85b2c07119","tarball":"https://registry.npmjs.org/@adimm/x-injection-reactjs/-/x-injection-reactjs-1.0.5.tgz","fileCount":7,"integrity":"sha512-B+UknW/QK640t8g/PFEK0Uo7sKexdzncFKFTRlg4+a3ydRpYciq0Ixz5ojsLI/0YYBBWIL4VwMS8puf8O7Zx6w==","signatures":[{"sig":"MEYCIQCtCMpB1eh8MSWvPePRCv9vRMylps0zHWyQ4+PElvS0SgIhAKH0IKxOjjfH1DtZq9GVZDNZB2S6jjPq4FjBGXkV//2k","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@adimm%2fx-injection-reactjs@1.0.5","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":72671},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=22.0.0"},"gitHead":"2e87022593c0510c110a624714270f1b1a3e62af","private":false,"scripts":{"lint":"eslint \"src/**/*.{ts,tsx}\" --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","update-base-lib":"npm i @adimm/x-injection@latest & git add package.json package-lock.json & git commit -m \"chore: install latest version of the `xInjection` base lib\""},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:476c6115-1dfd-4e0a-af56-96eab6401f53"}},"repository":{"url":"git+https://github.com/AdiMarianMutu/x-injection-reactjs.git"},"_npmVersion":"11.9.0","description":"ReactJS integration of the `xInjection` library.","directories":{},"sideEffects":false,"_nodeVersion":"22.22.0","dependencies":{"react":">=18.0.0","@adimm/x-injection":"^3.0.0"},"_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","@types/react":"^19.1.2","node-notifier":"^10.0.1","@tsconfig/node22":"^22.0.2","eslint-plugin-import":"^2.31.0","@testing-library/react":"^16.3.0","eslint-config-prettier":"^10.1.5","eslint-plugin-prettier":"^5.3.1","jest-environment-jsdom":"^30.0.0","typedoc-theme-hierarchy":"^6.0.0","@testing-library/jest-dom":"^6.6.3","@typescript-eslint/eslint-plugin":"^8.34.1","@ianvs/prettier-plugin-sort-imports":"^4.4.2"},"optionalDependencies":{"@rollup/rollup-linux-x64-gnu":"^4.43.0"},"_npmOperationalInternal":{"tmp":"tmp/x-injection-reactjs_1.0.5_1770658720482_0.3617890441593947","host":"s3://npm-registry-packages-npm-production"}},"1.0.6":{"name":"@adimm/x-injection-reactjs","version":"1.0.6","keywords":["inversion of control","ioc","di","dependency injection","reactjs","components","inversify","nest","ts","typescript"],"author":{"name":"Adi-Marian Mutu"},"license":"MIT","_id":"@adimm/x-injection-reactjs@1.0.6","maintainers":[{"name":"adimm","email":"mutu.adi.marian@gmail.com"}],"homepage":"https://github.com/AdiMarianMutu/x-injection-reactjs#readme","bugs":{"url":"https://github.com/AdiMarianMutu/x-injection-reactjs/issues"},"dist":{"shasum":"bd8c9eb84ca4df17d68be1f46924fdceee53f3e1","tarball":"https://registry.npmjs.org/@adimm/x-injection-reactjs/-/x-injection-reactjs-1.0.6.tgz","fileCount":7,"integrity":"sha512-08sInFGDSg/h1h/qFZ7U5B5T2j9h0PmWEVXSuk9Rye9gCPE1rLsU5wCq+JhQs7payh6rv4KVCWysRXsTltJgiA==","signatures":[{"sig":"MEUCIBjgjG3A4KJD84+BSBDIVSB8bBFfnyt+pPNg4/RKe56kAiEA7ULkd/xXR1BKJ7MbQUm6jADwd1QPxlwrwj/p9S35HUM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@adimm%2fx-injection-reactjs@1.0.6","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":65225},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=22.0.0"},"gitHead":"88634d0bd10a33e7c5627640ace92a8045a3c0a0","private":false,"scripts":{"lint":"eslint \"src/**/*.{ts,tsx}\" --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","update-base-lib":"npm i @adimm/x-injection@latest & git add package.json package-lock.json & git commit -m \"chore: install latest version of the `xInjection` base lib\""},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:476c6115-1dfd-4e0a-af56-96eab6401f53"}},"repository":{"url":"git+https://github.com/AdiMarianMutu/x-injection-reactjs.git"},"_npmVersion":"11.10.0","description":"ReactJS integration of the `xInjection` library.","directories":{},"sideEffects":false,"_nodeVersion":"22.22.0","dependencies":{"react":">=18.0.0","@adimm/x-injection":"^3.0.4"},"_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","@types/react":"^19.1.2","node-notifier":"^10.0.1","@tsconfig/node22":"^22.0.2","eslint-plugin-import":"^2.31.0","@testing-library/react":"^16.3.0","eslint-config-prettier":"^10.1.5","eslint-plugin-prettier":"^5.3.1","jest-environment-jsdom":"^30.0.0","typedoc-theme-hierarchy":"^6.0.0","@testing-library/jest-dom":"^6.6.3","@typescript-eslint/eslint-plugin":"^8.34.1","@ianvs/prettier-plugin-sort-imports":"^4.4.2"},"optionalDependencies":{"@rollup/rollup-linux-x64-gnu":"^4.43.0"},"_npmOperationalInternal":{"tmp":"tmp/x-injection-reactjs_1.0.6_1771435763265_0.8697859227792037","host":"s3://npm-registry-packages-npm-production"}},"1.0.7":{"name":"@adimm/x-injection-reactjs","private":false,"repository":{"url":"git+https://github.com/AdiMarianMutu/x-injection-reactjs.git"},"description":"ReactJS integration of the `xInjection` library.","version":"1.0.7","author":{"name":"Adi-Marian Mutu"},"homepage":"https://github.com/AdiMarianMutu/x-injection-reactjs#readme","bugs":{"url":"https://github.com/AdiMarianMutu/x-injection-reactjs/issues"},"keywords":["inversion of control","ioc","di","dependency injection","reactjs","components","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,tsx}\" --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","update-base-lib":"npm i @adimm/x-injection@latest & git add package.json package-lock.json & git commit -m \"chore: install latest version of the `xInjection` base lib\"","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":{"@adimm/x-injection":"^3.0.5","react":">=18.0.0"},"devDependencies":{"@ianvs/prettier-plugin-sort-imports":"^4.4.2","@swc/core":"^1.11.24","@testing-library/jest-dom":"^6.6.3","@testing-library/react":"^16.3.0","@tsconfig/node22":"^22.0.2","@types/jest":"^30.0.0","@types/react":"^19.1.2","@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","jest-environment-jsdom":"^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","type-fest":"^4.40.1","typedoc":"^0.28.4","typedoc-theme-hierarchy":"^6.0.0","typescript":"^5.8.3"},"optionalDependencies":{"@rollup/rollup-linux-x64-gnu":"^4.43.0"},"engines":{"node":">=22.0.0"},"type":"module","main":"./dist/index.cjs","module":"./dist/index.js","types":"./dist/index.d.ts","sideEffects":false,"gitHead":"6910a2e7506db40ee2727ee61ff2de18aa2fea09","_id":"@adimm/x-injection-reactjs@1.0.7","_nodeVersion":"24.14.1","_npmVersion":"11.11.0","dist":{"integrity":"sha512-R5wKhyK1ZBxhvhl2l9PEq1PkTcL3rygKyYGOfjhli/mJEQOojIW8tvliQd/Zhh91oOnNrUxIrC+JpqTWc2quXQ==","shasum":"3897bccdba0d8da2b87530031b75e2c871f60ebf","tarball":"https://registry.npmjs.org/@adimm/x-injection-reactjs/-/x-injection-reactjs-1.0.7.tgz","fileCount":7,"unpackedSize":65225,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@adimm%2fx-injection-reactjs@1.0.7","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIGbjg4iLEXYmhEfzFKZxeRus4WimbLrfanTYyVdpUV0NAiEA8gh0ti0l5aLywZcLOuiD+pFvI08OAteIsgTnc2nLTz0="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:476c6115-1dfd-4e0a-af56-96eab6401f53"}},"directories":{},"maintainers":[{"name":"adimm","email":"mutu.adi.marian@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/x-injection-reactjs_1.0.7_1776516934454_0.24760195630120507"},"_hasShrinkwrap":false}},"time":{"created":"2025-05-08T20:13:38.640Z","modified":"2026-04-18T12:55:34.855Z","0.1.0":"2025-05-08T20:13:38.965Z","0.1.1":"2025-05-08T22:00:09.018Z","0.1.2":"2025-05-09T07:15:40.385Z","0.2.0":"2025-05-12T00:54:44.875Z","0.2.1":"2025-05-13T10:11:09.204Z","0.2.2":"2025-05-13T23:15:30.629Z","0.2.3":"2025-05-14T00:17:05.865Z","0.2.4":"2025-05-14T12:52:32.494Z","0.2.5":"2025-05-14T15:42:07.327Z","0.3.0":"2025-05-16T23:12:24.825Z","0.3.1":"2025-05-18T19:06:26.544Z","1.0.0":"2025-06-18T20:28:54.667Z","1.0.1":"2025-06-20T08:06:27.721Z","1.0.2":"2025-06-29T14:08:28.821Z","1.0.3":"2026-02-08T16:37:53.305Z","1.0.4":"2026-02-08T21:21:52.918Z","1.0.5":"2026-02-09T17:38:40.634Z","1.0.6":"2026-02-18T17:29:23.429Z","1.0.7":"2026-04-18T12:55:34.588Z"},"bugs":{"url":"https://github.com/AdiMarianMutu/x-injection-reactjs/issues"},"author":{"name":"Adi-Marian Mutu"},"license":"MIT","homepage":"https://github.com/AdiMarianMutu/x-injection-reactjs#readme","keywords":["inversion of control","ioc","di","dependency injection","reactjs","components","inversify","nest","ts","typescript"],"repository":{"url":"git+https://github.com/AdiMarianMutu/x-injection-reactjs.git"},"description":"ReactJS integration of the `xInjection` library.","maintainers":[{"name":"adimm","email":"mutu.adi.marian@gmail.com"}],"readme":"<p align=\"center\">\r\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-reactjs\" target=\"__blank\"><img src=\"https://badgen.net/npm/v/@adimm/x-injection-reactjs\"></a>\r\n<a href=\"https://app.codecov.io/gh/AdiMarianMutu/x-injection-reactjs\" target=\"__blank\"><img src=\"https://badgen.net/codecov/c/github/AdiMarianMutu/x-injection-reactjs\"></a>\r\n<img src=\"https://badgen.net/npm/license/@adimm/x-injection-reactjs\">\r\n</p>\r\n\r\n<p align=\"center\">\r\n<a href=\"https://github.com/AdiMarianMutu/x-injection-reactjs/actions/workflows/ci.yml?query=branch%3Amain\" target=\"__blank\"><img src=\"https://github.com/AdiMarianMutu/x-injection-reactjs/actions/workflows/ci.yml/badge.svg?branch=main\"></a>\r\n<a href=\"https://github.com/AdiMarianMutu/x-injection-reactjs/actions/workflows/publish.yml\" target=\"__blank\"><img src=\"https://github.com/AdiMarianMutu/x-injection-reactjs/actions/workflows/publish.yml/badge.svg\"></a>\r\n<br>\r\n<img src=\"https://badgen.net/bundlephobia/minzip/@adimm/x-injection-reactjs\">\r\n<a href=\"https://www.npmjs.com/package/@adimm/x-injection-reactjs\" target=\"__blank\"><img src=\"https://badgen.net/npm/dm/@adimm/x-injection-reactjs\"></a>\r\n</p>\r\n\r\n**Stop wrestling with React Context and prop drilling. Build scalable React apps with clean, testable business logic separated from UI.**\r\n\r\n> **TL;DR** — Mark classes with `@Injectable()`, declare a `ProviderModule.blueprint()`, wrap your component with `provideModuleToComponent(MyModuleBp, () => { ... })`, then call `useInject(MyService)` inside. Dependencies are resolved automatically — no providers, no prop drilling, no manual wiring.\r\n\r\n## Table of Contents\r\n\r\n- [Table of Contents](#table-of-contents)\r\n- [What Problems Does This Solve?](#what-problems-does-this-solve)\r\n  - [1. Provider Hell](#1-provider-hell)\r\n  - [2. Prop Drilling](#2-prop-drilling)\r\n  - [3. Manual Dependency Wiring](#3-manual-dependency-wiring)\r\n  - [4. Business Logic Mixed with UI](#4-business-logic-mixed-with-ui)\r\n- [Installation](#installation)\r\n- [Quick Start](#quick-start)\r\n- [How It Works](#how-it-works)\r\n  - [1. Services: Your Business Logic](#1-services-your-business-logic)\r\n  - [2. Modules: Organizing Dependencies](#2-modules-organizing-dependencies)\r\n  - [3. Injecting Services into Components](#3-injecting-services-into-components)\r\n- [The Power of Component-Scoped Modules](#the-power-of-component-scoped-modules)\r\n  - [What Are Component-Scoped Modules?](#what-are-component-scoped-modules)\r\n  - [Pattern 1: Multiple Independent Instances](#pattern-1-multiple-independent-instances)\r\n  - [Pattern 2: Parent-Child Dependency Control](#pattern-2-parent-child-dependency-control)\r\n- [Why Use the HoC Approach?](#why-use-the-hoc-approach)\r\n  - [1. Lifecycle-Bound Isolated Containers](#1-lifecycle-bound-isolated-containers)\r\n  - [2. Composition and Reusability](#2-composition-and-reusability)\r\n- [Hierarchical Dependency Injection](#hierarchical-dependency-injection)\r\n  - [Creating Custom Hooks with Dependencies](#creating-custom-hooks-with-dependencies)\r\n  - [Parent Components Controlling Child Dependencies](#parent-components-controlling-child-dependencies)\r\n  - [Module Imports and Exports](#module-imports-and-exports)\r\n- [Real-World Examples](#real-world-examples)\r\n  - [Zustand Store Integration](#zustand-store-integration)\r\n  - [Complex Form with Shared State](#complex-form-with-shared-state)\r\n- [Testing Your Code](#testing-your-code)\r\n  - [Mocking an Entire Module](#mocking-an-entire-module)\r\n  - [Mocking on-the-fly](#mocking-on-the-fly)\r\n- [FAQ](#faq)\r\n  - [How do I add global services?](#how-do-i-add-global-services)\r\n  - [When should I use global modules vs component-scoped modules?](#when-should-i-use-global-modules-vs-component-scoped-modules)\r\n  - [Can I use this with Redux/MobX/Zustand?](#can-i-use-this-with-reduxmobxzustand)\r\n  - [How does this compare to React Context?](#how-does-this-compare-to-react-context)\r\n  - [If I want Angular patterns, why not just use Angular?](#if-i-want-angular-patterns-why-not-just-use-angular)\r\n  - [Can I migrate gradually from an existing React app?](#can-i-migrate-gradually-from-an-existing-react-app)\r\n  - [When do I actually need `provideModuleToComponent`?](#when-do-i-actually-need-providemoduletocomponent)\r\n  - [What's the performance impact?](#whats-the-performance-impact)\r\n  - [Why use classes for services instead of custom hooks?](#why-use-classes-for-services-instead-of-custom-hooks)\r\n- [Links](#links)\r\n- [Contributing](#contributing)\r\n- [License](#license)\r\n\r\n## What Problems Does This Solve?\r\n\r\nIf you've built React apps, you've probably encountered these pain points:\r\n\r\n### 1. Provider Hell\r\n\r\nYour `App.tsx` becomes a nightmare of nested providers:\r\n\r\n```tsx\r\n<AuthProvider>\r\n  <ThemeProvider>\r\n    <ApiProvider>\r\n      <ToastProvider>\r\n        <UserProvider>\r\n          <App />\r\n        </UserProvider>\r\n      </ToastProvider>\r\n    </ApiProvider>\r\n  </ThemeProvider>\r\n</AuthProvider>\r\n```\r\n\r\n### 2. Prop Drilling\r\n\r\nYou pass props through 5 levels of components just to reach the one that needs them:\r\n\r\n```tsx\r\n<Dashboard user={user}>\r\n  <Sidebar user={user}>\r\n    <UserMenu user={user}>\r\n      <UserAvatar user={user} /> {/* Finally! */}\r\n    </UserMenu>\r\n  </Sidebar>\r\n</Dashboard>\r\n```\r\n\r\n### 3. Manual Dependency Wiring\r\n\r\nWhen a service needs dependencies, you manually create them in the right order:\r\n\r\n```tsx\r\nfunction UserProfile() {\r\n  // Must create ALL dependencies manually in correct order\r\n  const toastService = new ToastService();\r\n  const apiService = new ApiService();\r\n  const authService = new AuthService(apiService);\r\n  const userProfileService = new UserProfileService(apiService, authService, toastService);\r\n\r\n  // If AuthService adds a new dependency tomorrow, THIS BREAKS!\r\n  return <div>{userProfileService.displayName}</div>;\r\n}\r\n```\r\n\r\n### 4. Business Logic Mixed with UI\r\n\r\nYour components become bloated with API calls, state management, and validation:\r\n\r\n```tsx\r\nfunction UserDashboard() {\r\n  const [user, setUser] = useState(null);\r\n  const [loading, setLoading] = useState(false);\r\n\r\n  useEffect(() => {\r\n    setLoading(true);\r\n    fetch('/api/user')\r\n      .then((res) => res.json())\r\n      .then((data) => {\r\n        setUser(data);\r\n        setLoading(false);\r\n      });\r\n  }, []);\r\n\r\n  // 50 more lines of business logic...\r\n\r\n  return <div>{/* Your actual UI */}</div>;\r\n}\r\n```\r\n\r\nxInjection solves all of the above by bringing **Inversion of Control (IoC)** and **Dependency Injection (DI)** to React: instead of components creating and managing their own dependencies, they just ask for what they need and xInjection provides it — automatically, type-safely, and testably.\r\n\r\nThis is the official [ReactJS](https://react.dev/) implementation of [xInjection](https://github.com/AdiMarianMutu/x-injection).\r\n\r\n## Installation\r\n\r\n```sh\r\nnpm i @adimm/x-injection-reactjs reflect-metadata\r\n```\r\n\r\n> [!IMPORTANT]\r\n> Import `reflect-metadata` at the very top of your app entry point:\r\n\r\n```tsx\r\n// main.tsx or index.tsx\r\n\r\nimport 'reflect-metadata';\r\n\r\nimport { createRoot } from 'react-dom/client';\r\n\r\nimport App from './App';\r\n\r\ncreateRoot(document.getElementById('root')!).render(<App />);\r\n```\r\n\r\n**TypeScript Configuration**\r\n\r\nAdd to your `tsconfig.json`:\r\n\r\n```json\r\n{\r\n  \"compilerOptions\": {\r\n    \"experimentalDecorators\": true,\r\n    \"emitDecoratorMetadata\": true\r\n  }\r\n}\r\n```\r\n\r\n> **📚 Advanced Concepts**\r\n>\r\n> This documentation covers React-specific usage patterns. For advanced features like **lifecycle hooks** (`onReady`, `onDispose`), **injection scopes** (Singleton, Transient, Request), **middlewares**, **events**, and **dynamic module updates**, refer to the [base xInjection library documentation](https://github.com/AdiMarianMutu/x-injection).\r\n>\r\n> The base library provides the core IoC/DI engine that powers this React integration.\r\n\r\n## Quick Start\r\n\r\nThree files, three concepts: global services declared once, a component-scoped module, and a component that injects both.\r\n\r\n**Step 1 — Declare global services** in your entry point:\r\n\r\n```tsx\r\n// main.tsx - Your app entry point\r\n\r\nimport 'reflect-metadata';\r\n\r\nimport { Injectable, ProviderModule } from '@adimm/x-injection';\r\nimport { createRoot } from 'react-dom/client';\r\n\r\nimport App from './App';\r\n\r\n// Global services (singletons)\r\n@Injectable()\r\nclass ApiService {\r\n  get(url: string) {\r\n    return fetch(url).then((r) => r.json());\r\n  }\r\n}\r\n\r\n@Injectable()\r\nclass AuthService {\r\n  constructor(private readonly apiService: ApiService) {}\r\n\r\n  isLoggedIn = false;\r\n\r\n  login() {\r\n    this.isLoggedIn = true;\r\n  }\r\n}\r\n\r\n// Create global module - automatically imported into built-in AppModule\r\nProviderModule.blueprint({\r\n  id: 'AppBootstrapModule',\r\n  isGlobal: true,\r\n  providers: [ApiService, AuthService],\r\n  exports: [ApiService, AuthService], // Exported services available everywhere\r\n});\r\n\r\n// Now render your app\r\ncreateRoot(document.getElementById('root')!).render(<App />);\r\n```\r\n\r\n**Step 2 — Create a component-scoped module and inject services:**\r\n\r\n```tsx\r\n// UserDashboard.tsx - A component with its own service\r\n\r\nimport { Injectable, ProviderModule } from '@adimm/x-injection';\r\nimport { provideModuleToComponent, useInject } from '@adimm/x-injection-reactjs';\r\n\r\n// Component-scoped service\r\n@Injectable()\r\nclass UserDashboardService {\r\n  constructor(private readonly apiService: ApiService) {} // Gets global ApiService\r\n\r\n  async loadUser() {\r\n    return this.apiService.get('/user');\r\n  }\r\n}\r\n\r\n// Component-scoped module\r\nconst UserDashboardModuleBp = ProviderModule.blueprint({\r\n  id: 'UserDashboardModule',\r\n  providers: [UserDashboardService],\r\n});\r\n\r\n// Component with injected service\r\nexport const UserDashboard = provideModuleToComponent(UserDashboardModuleBp, () => {\r\n  const dashboardService = useInject(UserDashboardService);\r\n  const authService = useInject(AuthService); // Can also inject global services\r\n\r\n  return (\r\n    <div>\r\n      <h1>Dashboard</h1>\r\n      <p>Logged in: {authService.isLoggedIn ? 'Yes' : 'No'}</p>\r\n    </div>\r\n  );\r\n});\r\n```\r\n\r\n**Step 3 — Use the component** — each instance gets its own module:\r\n\r\n```tsx\r\n// App.tsx\r\n\r\nimport { UserDashboard } from './UserDashboard';\r\n\r\nexport default function App() {\r\n  return (\r\n    <div>\r\n      <UserDashboard />\r\n      <UserDashboard /> {/* Each gets its own UserDashboardService */}\r\n    </div>\r\n  );\r\n}\r\n```\r\n\r\n> [!TIP] Global vs component-scoped services:\r\n>\r\n> - Global services (`ApiService`, `AuthService`): Defined in a global blueprint, automatically imported into the built-in `AppModule`\r\n> - Component-scoped services (`UserDashboardService`): Fresh instance per `<UserDashboard />`\r\n> - Component-scoped services can inject global services automatically\r\n\r\n## How It Works\r\n\r\nLet's break down the three main concepts you'll use:\r\n\r\n### 1. Services: Your Business Logic\r\n\r\nA **service** is just a class that contains your business logic. Think of it as extracting all the \"smart stuff\" from your component into a reusable, testable class.\r\n\r\n```tsx\r\n@Injectable()\r\nclass TodoService {\r\n  private todos: Todo[] = [];\r\n\r\n  addTodo(text: string) {\r\n    this.todos.push({ id: Date.now(), text, completed: false });\r\n  }\r\n\r\n  getTodos() {\r\n    return this.todos;\r\n  }\r\n\r\n  toggleTodo(id: number) {\r\n    const todo = this.todos.find((t) => t.id === id);\r\n    if (todo) todo.completed = !todo.completed;\r\n  }\r\n}\r\n```\r\n\r\nThe `@Injectable()` decorator marks this class as something that can be injected (either into components or other services/modules).\r\n\r\n**Services can depend on other services:**\r\n\r\n```tsx\r\n@Injectable()\r\nclass UserProfileService {\r\n  // Dependencies are automatically injected via constructor\r\n  constructor(\r\n    private readonly apiService: ApiService,\r\n    private readonly authService: AuthService,\r\n    private readonly toastService: ToastService\r\n  ) {}\r\n\r\n  async loadProfile() {\r\n    try {\r\n      const userId = this.authService.getCurrentUserId();\r\n      const profile = await this.apiService.get(`/users/${userId}`);\r\n      return profile;\r\n    } catch (error) {\r\n      this.toastService.error('Failed to load profile');\r\n      throw error;\r\n    }\r\n  }\r\n}\r\n```\r\n\r\nNotice how `UserProfileService` asks for its dependencies in the constructor? xInjection will automatically provide them.\r\n\r\n**Alternative: Property Injection**\r\n\r\nYou can also use the `@Inject` decorator from the base library for property injection:\r\n\r\n```tsx\r\nimport { Inject, Injectable } from '@adimm/x-injection';\r\n\r\n@Injectable()\r\nclass UserProfileService {\r\n  @Inject(ApiService)\r\n  private readonly apiService!: ApiService;\r\n\r\n  @Inject(AuthService)\r\n  private readonly authService!: AuthService;\r\n\r\n  async loadProfile() {\r\n    const userId = this.authService.getCurrentUserId();\r\n    return this.apiService.get(`/users/${userId}`);\r\n  }\r\n}\r\n```\r\n\r\nBoth approaches work! Constructor injection is generally preferred for better type safety and easier testing.\r\n\r\n### 2. Modules: Organizing Dependencies\r\n\r\nA **module** is a container that tells xInjection which services are available. Think of it as a \"package\" of services.\r\n\r\n**Modules come in two flavors:**\r\n\r\n```tsx\r\n// Global module: Created once, shared everywhere\r\nProviderModule.blueprint({\r\n  id: 'AppBootstrapModule',\r\n  isGlobal: true,\r\n  providers: [ApiService, AuthService, ToastService],\r\n  exports: [ApiService, AuthService, ToastService], // Only exported services become globally available\r\n});\r\n\r\n// Component-scoped module: Each component instance gets its own\r\nconst TodoListModuleBp = ProviderModule.blueprint({\r\n  id: 'TodoListModule',\r\n  providers: [TodoService], // Gets a fresh TodoService per component\r\n});\r\n```\r\n\r\n> [!IMPORTANT]\r\n> When using `isGlobal: true`, only services listed in the `exports` array become globally available. Non-exported providers remain private to the module.\r\n\r\n> [!CAUTION] Global modules cannot be used with `provideModuleToComponent`\r\n> Attempting to provide a global module to a component will throw an `InjectionProviderModuleError`. Global services are accessed directly via `useInject` without the HoC.\r\n\r\n**`blueprint()` vs `create()`:**\r\n\r\n- **`blueprint()`**: A deferred module template. Each time it is imported or used with `provideModuleToComponent`, a **new independent instance** is created. Use for the global bootstrap module and for component-scoped modules. [Learn more](https://github.com/AdiMarianMutu/x-injection?tab=readme-ov-file#blueprints).\r\n- **`create()`**: Immediately instantiates a module. The resulting instance is a **single shared object** — every module that imports it shares the exact same instance. Use when you need a module that is instantiated once and shared across multiple other modules.\r\n\r\nSee [Module Imports and Exports](#module-imports-and-exports) for examples of both.\r\n\r\n> [!CAUTION] Never import `AppModule` into other modules\r\n> `AppModule` is the built-in global container and importing it will throw an error. Use global blueprints with `isGlobal: true` instead, which are automatically imported into `AppModule`.\r\n\r\n### 3. Injecting Services into Components\r\n\r\nUse the `provideModuleToComponent` Higher-Order Component (HoC) to give your component access to services:\r\n\r\n```tsx\r\nconst UserDashboard = provideModuleToComponent(UserDashboardModuleBp, () => {\r\n  // Inject the service you need\r\n  const userProfileService = useInject(UserProfileService);\r\n\r\n  return <div>{userProfileService.displayName}</div>;\r\n});\r\n```\r\n\r\nThe HoC does two things:\r\n\r\n1. Creates an instance of your module (and all its services)\r\n2. Makes those services available via the `useInject` hook\r\n\r\n**You can also inject multiple services at once:**\r\n\r\n```tsx\r\nconst MyComponent = provideModuleToComponent(MyModuleBp, () => {\r\n  const [userService, apiService] = useInjectMany(UserService, ApiService);\r\n\r\n  // Use your services...\r\n});\r\n```\r\n\r\n## The Power of Component-Scoped Modules\r\n\r\nOne of the most powerful features of xInjection is **component-scoped modules**. This is something you can't easily achieve with React Context alone.\r\n\r\n### What Are Component-Scoped Modules?\r\n\r\nWhen you use `provideModuleToComponent`, each instance of your component gets its **own copy** of the module and all its services. This enables powerful patterns:\r\n\r\n### Pattern 1: Multiple Independent Instances\r\n\r\n```tsx\r\n@Injectable()\r\nclass CounterService {\r\n  count = 0;\r\n  increment() {\r\n    this.count++;\r\n  }\r\n}\r\n\r\nconst CounterModuleBp = ProviderModule.blueprint({\r\n  id: 'CounterModule',\r\n  providers: [CounterService],\r\n});\r\n\r\nconst Counter = provideModuleToComponent(CounterModuleBp, () => {\r\n  const counterService = useInject(CounterService);\r\n  return (\r\n    <div>\r\n      <p>Count: {counterService.count}</p>\r\n      <button onClick={() => counterService.increment()}>+</button>\r\n    </div>\r\n  );\r\n});\r\n\r\nfunction App() {\r\n  return (\r\n    <div>\r\n      <Counter /> {/* Count: 0 */}\r\n      <Counter /> {/* Count: 0 (separate instance!) */}\r\n    </div>\r\n  );\r\n}\r\n```\r\n\r\nEach `<Counter />` has its own `CounterService`, so they don't interfere with each other.\r\n\r\n### Pattern 2: Parent-Child Dependency Control\r\n\r\nParent components can \"inject\" specific service instances into their children:\r\n\r\n```tsx\r\nconst ParentModuleBp = ProviderModule.blueprint({\r\n  id: 'ParentModule',\r\n  providers: [SharedService, ParentService],\r\n});\r\n\r\nconst ChildModuleBp = ProviderModule.blueprint({\r\n  id: 'ChildModule',\r\n  providers: [SharedService, ChildService],\r\n});\r\n\r\nconst Child = provideModuleToComponent(ChildModuleBp, () => {\r\n  const sharedService = useInject(SharedService);\r\n  return <div>{sharedService.data}</div>;\r\n});\r\n\r\nconst Parent = provideModuleToComponent(ParentModuleBp, () => {\r\n  const sharedService = useInject(SharedService);\r\n\r\n  // Pass the parent's SharedService instance to the child\r\n  return <Child inject={[{ provide: SharedService, useValue: sharedService }]} />;\r\n});\r\n```\r\n\r\nThis enables complex patterns like form components sharing validation services, or composite UI components coordinating state.\r\n\r\n## Why Use the HoC Approach?\r\n\r\nYou might wonder: \"Why wrap my component with `provideModuleToComponent` instead of just using `useInject` directly everywhere?\"\r\n\r\n**Short answer:** You don't always need it! If you only use global services, you can just call `useInject` anywhere. But for **component-scoped modules** (where each component instance needs its own services), you need `provideModuleToComponent`.\r\n\r\nThe Higher-Order Component (HoC) pattern provides several key benefits:\r\n\r\n### 1. Lifecycle-Bound Isolated Containers\r\n\r\nEach wrapped component gets its **own** dependency container, created on mount and disposed on unmount. Two instances of `<TodoList />` each get their own `TodoService` — they never share state. When the component unmounts, `onDispose` runs automatically, cleaning up only that component's services. Imported global services remain unaffected.\r\n\r\n### 2. Composition and Reusability\r\n\r\nThe HoC pattern works seamlessly with React's component composition model:\r\n\r\n```tsx\r\n// Reusable component with its own dependencies\r\nconst TodoList = provideModuleToComponent(TodoListModuleBp, () => {\r\n  const todoService = useInject(TodoService);\r\n  // ...\r\n});\r\n\r\n// Use it multiple times, each with isolated state\r\nfunction App() {\r\n  return (\r\n    <>\r\n      <TodoList /> {/* Gets its own TodoService */}\r\n      <TodoList /> {/* Gets a different TodoService */}\r\n    </>\r\n  );\r\n}\r\n```\r\n\r\n## Hierarchical Dependency Injection\r\n\r\nEvery component wrapped with `provideModuleToComponent` gets its own module container. When `useInject` is called inside that component, xInjection walks a well-defined lookup chain:\r\n\r\n1. **Own module** — services declared in the component's own blueprint\r\n2. **Imported modules** — exported services from modules listed in `imports`\r\n3. **AppModule** — globally available services (from `isGlobal: true` blueprints)\r\n\r\n```\r\nuseInject(SomeService)  ← called inside <MyComponent />\r\n          │\r\n          ▼\r\n┌─────────────────────────┐\r\n│   MyComponent's module  │  ← providers: [MyService, ...]\r\n│     (own container)     │\r\n└───────────┬─────────────┘\r\n            │ not found\r\n            ▼\r\n┌─────────────────────────┐\r\n│   Imported modules      │  ← imports: [SharedModule]\r\n│   (exported only)       │     SharedModule.exports: [SharedService]\r\n└───────────┬─────────────┘\r\n            │ not found\r\n            ▼\r\n┌─────────────────────────┐\r\n│       AppModule         │  ← AppBootstrapModule { isGlobal: true }\r\n│  (global services)      │     exports: [ApiService, AuthService, ...]\r\n└───────────┬─────────────┘\r\n            │ not found\r\n            ▼\r\n      throws error\r\n```\r\n\r\n**Component example:**\r\n\r\n```tsx\r\n// ① Global services — live in AppModule, available everywhere\r\n@Injectable()\r\nclass ApiService {}\r\n@Injectable()\r\nclass AuthService {}\r\n\r\nProviderModule.blueprint({\r\n  id: 'AppBootstrapModule',\r\n  isGlobal: true,\r\n  providers: [ApiService, AuthService],\r\n  exports: [ApiService, AuthService],\r\n});\r\n\r\n// ② Shared module — created once, imported into component blueprints\r\n@Injectable()\r\nclass AnalyticsService {}\r\n\r\nconst SharedModule = ProviderModule.create({\r\n  id: 'SharedModule',\r\n  providers: [AnalyticsService],\r\n  exports: [AnalyticsService], // ✅ visible to importers\r\n});\r\n\r\n// ③ Component-scoped service — private to this component\r\n@Injectable()\r\nclass DashboardService {\r\n  constructor(\r\n    private readonly api: ApiService, // resolved from ③ AppModule\r\n    private readonly analytics: AnalyticsService // resolved from ② SharedModule\r\n  ) {}\r\n}\r\n\r\nconst DashboardModuleBp = ProviderModule.blueprint({\r\n  id: 'DashboardModule',\r\n  imports: [SharedModule],\r\n  providers: [DashboardService], // ① own container\r\n});\r\n\r\nconst Dashboard = provideModuleToComponent(DashboardModuleBp, () => {\r\n  const dashboard = useInject(DashboardService); // ✅ ① own module\r\n  const analytics = useInject(AnalyticsService); // ✅ ② SharedModule export\r\n  const auth = useInject(AuthService); // ✅ ③ AppModule (global)\r\n\r\n  // useInject(SomePrivateService)               // ❌ not found → error\r\n});\r\n```\r\n\r\n> [!TIP]\r\n> A service that is not listed in a module's `exports` is completely invisible to any component that imports that module. This is how xInjection enforces encapsulation — only what you explicitly export crosses the module boundary.\r\n\r\n### Creating Custom Hooks with Dependencies\r\n\r\nThe `hookFactory` function lets you create reusable custom hooks that automatically receive injected dependencies:\r\n\r\n```tsx\r\n// Define a custom hook with dependencies\r\nconst useUserProfile = hookFactory({\r\n  use: ({ userId, deps: [apiService, authService] }) => {\r\n    const [profile, setProfile] = useState(null);\r\n\r\n    useEffect(() => {\r\n      apiService.get(`/users/${userId}`).then(setProfile);\r\n    }, [userId]);\r\n\r\n    return profile;\r\n  },\r\n  inject: [ApiService, AuthService],\r\n});\r\n\r\n// Use it in any component\r\nconst UserProfile = provideModuleToComponent<{ userId: number }>(UserModuleBp, ({ userId }) => {\r\n  const profile = useUserProfile({ userId });\r\n  return <div>{profile?.name}</div>;\r\n});\r\n```\r\n\r\n**Type-safe hooks with `HookWithDeps`:**\r\n\r\nUse the `HookWithDeps<P, D>` type utility for full TypeScript support:\r\n\r\n```tsx\r\nimport type { HookWithDeps } from '@adimm/x-injection-reactjs';\r\n\r\n// Hook with no parameters - use void as first generic\r\nconst useTestHook = hookFactory({\r\n  use: ({ deps: [testService] }: HookWithDeps<void, [TestService]>) => {\r\n    return testService.value;\r\n  },\r\n  inject: [TestService],\r\n});\r\n\r\n// Hook with parameters - specify parameter type as first generic\r\nconst useUserData = hookFactory({\r\n  use: ({ userId, deps: [apiService] }: HookWithDeps<{ userId: number }, [ApiService]>) => {\r\n    const [data, setData] = useState(null);\r\n    useEffect(() => {\r\n      apiService.get(`/users/${userId}`).then(setData);\r\n    }, [userId]);\r\n    return data;\r\n  },\r\n  inject: [ApiService],\r\n});\r\n\r\n// Usage:\r\nuseTestHook(); // No parameters\r\nuseUserData({ userId: 123 }); // With parameters\r\n```\r\n\r\n**`HookWithDeps<P, D>` generics:**\r\n\r\n- **`P`**: Hook parameter type (use `void` if no parameters, or `{ param1: type, ... }` for parameters)\r\n- **`D`**: Tuple type matching your `inject` array (e.g., `[ApiService, AuthService]`)\r\n\r\n> [!TIP] Why use hookFactory?\r\n>\r\n> - Dependencies are automatically injected\r\n> - Hooks are reusable across components\r\n> - Type-safe with TypeScript\r\n> - Easier to test (mock dependencies)\r\n\r\n### Parent Components Controlling Child Dependencies\r\n\r\nThe `inject` prop allows parent components to override child component dependencies. See [Pattern 2](#pattern-2-parent-child-dependency-control) for a basic example and the [Complex Form example](#complex-form-with-shared-state) for a real-world use case.\r\n\r\n### Module Imports and Exports\r\n\r\nModules can import other modules. The key question is: **should the imported module be shared or duplicated per component?**\r\n\r\n**Shared module instance → `ProviderModule.create()`:**\r\n\r\nUse `create()` when a module should exist as one instance and be shared by all blueprints that import it:\r\n\r\n```tsx\r\n// Instantiated once — all importers share the same instance and the same singletons\r\nconst CoreModule = ProviderModule.create({\r\n  id: 'CoreModule',\r\n  providers: [SomeSharedService],\r\n  exports: [SomeSharedService],\r\n});\r\n\r\nconst UserModuleBp = ProviderModule.blueprint({\r\n  id: 'UserModule',\r\n  imports: [CoreModule], // every <UserComponent /> shares the same CoreModule\r\n  providers: [UserService],\r\n});\r\n\r\nconst ProductModuleBp = ProviderModule.blueprint({\r\n  id: 'ProductModule',\r\n  imports: [CoreModule], // same CoreModule instance\r\n  providers: [ProductService],\r\n});\r\n```\r\n\r\n**Per-component isolation → blueprint imports:**\r\n\r\nImport a blueprint when each component instance should get its own independent copy of those providers:\r\n\r\n```tsx\r\nconst UserModuleBp = ProviderModule.blueprint({\r\n  id: 'UserModule',\r\n  imports: [FormValidationModuleBp], // each <UserComponent /> gets its own FormValidationService\r\n  providers: [UserService],\r\n});\r\n```\r\n\r\n**Re-exporting:**\r\n\r\n```tsx\r\nconst CoreModule = ProviderModule.create({\r\n  id: 'CoreModule',\r\n  imports: [DatabaseModule, CacheModule],\r\n  exports: [DatabaseModule, CacheModule], // expose both to importers\r\n});\r\n```\r\n\r\n## Real-World Examples\r\n\r\n### Zustand Store Integration\r\n\r\nxInjection works beautifully with Zustand. The pattern is simple: **encapsulate the Zustand store inside a service**. This keeps your business logic in services while using Zustand for reactive state.\r\n\r\n**Why this pattern?**\r\n\r\n- Business logic stays in services (testable, reusable)\r\n- Components subscribe to state reactively (optimal re-renders)\r\n- Store is scoped to the component (no global state pollution)\r\n- Type-safe and easy to test\r\n\r\n```ts\r\n// counter.service.ts\r\n\r\nimport { Injectable } from '@adimm/x-injection';\r\nimport { create } from 'zustand';\r\n\r\ninterface CounterStore {\r\n  count: number;\r\n  increment: () => void;\r\n  decrement: () => void;\r\n  reset: () => void;\r\n}\r\n\r\n@Injectable()\r\nexport class CounterService {\r\n  // Store instance encapsulated within the service\r\n  private readonly store = create<CounterStore>((set) => ({\r\n    count: 0,\r\n    increment: () => set((state) => ({ count: state.count + 1 })),\r\n    decrement: () => set((state) => ({ count: state.count - 1 })),\r\n    reset: () => set({ count: 0 }),\r\n  }));\r\n\r\n  // Expose store hook for components to subscribe\r\n  get useStore() {\r\n    return this.store;\r\n  }\r\n\r\n  // Getter to access current state from within the service\r\n  private get storeState() {\r\n    return this.store.getState();\r\n  }\r\n\r\n  // Business logic methods\r\n  increment() {\r\n    this.storeState.increment();\r\n  }\r\n\r\n  decrement() {\r\n    this.storeState.decrement();\r\n  }\r\n\r\n  reset() {\r\n    this.storeState.reset();\r\n  }\r\n\r\n  incrementBy(amount: number) {\r\n    // Complex logic lives in the service\r\n    const currentCount = this.storeState.count;\r\n    this.store.setState({ count: currentCount + amount });\r\n  }\r\n\r\n  async incrementAsync() {\r\n    // Handle async operations in the service\r\n    await new Promise((resolve) => setTimeout(resolve, 1000));\r\n    this.increment();\r\n  }\r\n}\r\n```\r\n\r\n```ts\r\n// counter.module.ts\r\n\r\nimport { ProviderModule } from '@adimm/x-injection';\r\n\r\nimport { CounterService } from './counter.service';\r\n\r\nexport const CounterModuleBp = ProviderModule.blueprint({\r\n  id: 'CounterModule',\r\n  providers: [CounterService],\r\n  exports: [CounterService],\r\n});\r\n```\r\n\r\n```tsx\r\n// counter.component.tsx\r\n\r\nimport { provideModuleToComponent, useInject } from '@adimm/x-injection-reactjs';\r\n\r\nimport { CounterModuleBp } from './counter.module';\r\nimport { CounterService } from './counter.service';\r\n\r\nconst Counter = provideModuleToComponent(CounterModuleBp, () => {\r\n  // Inject service for business logic\r\n  const counterService = useInject(CounterService);\r\n\r\n  // Subscribe to store for reactive state\r\n  const count = counterService.useStore((state) => state.count);\r\n\r\n  return (\r\n    <div>\r\n      <h2>Count: {count}</h2>\r\n      <button onClick={() => counterService.increment()}>+1</button>\r\n      <button onClick={() => counterService.decrement()}>-1</button>\r\n      <button onClick={() => counterService.incrementBy(5)}>+5</button>\r\n      <button onClick={() => counterService.incrementAsync()}>+1 Async</button>\r\n      <button onClick={() => counterService.reset()}>Reset</button>\r\n    </div>\r\n  );\r\n});\r\n\r\nexport default Counter;\r\n```\r\n\r\n**Key Benefits:**\r\n\r\n- **Encapsulation**: Store is encapsulated within the service, not exposed globally\r\n- **Separation of concerns**: Business logic in services, UI only subscribes to state\r\n- **Testability**: Services are self-contained and easy to test\r\n- **Reusability**: Services with stores can be shared across components via dependency injection\r\n- **Type safety**: Full TypeScript support throughout\r\n\r\n### Complex Form with Shared State\r\n\r\nThis example demonstrates a powerful pattern: a parent form component controlling the state of multiple child input components.\r\n\r\n```tsx\r\nimport { Inject, Injectable, InjectionScope } from '@adimm/x-injection';\r\n\r\n// 1. Input service - manages a single input's state\r\n@Injectable()\r\nclass InputService {\r\n  value = '';\r\n  error = '';\r\n\r\n  setValue(value: string) {\r\n    this.value = value;\r\n    this.validate();\r\n  }\r\n\r\n  validate() {\r\n    if (!this.value) {\r\n      this.error = 'Required';\r\n    } else if (this.value.length < 3) {\r\n      this.error = 'Too short';\r\n    } else {\r\n      this.error = '';\r\n    }\r\n    return !this.error;\r\n  }\r\n}\r\n\r\n// 2. Form service - manages the entire form\r\n@Injectable()\r\nclass FormService {\r\n  constructor(\r\n    public readonly nameInput: InputService,\r\n    public readonly emailInput: InputService\r\n  ) {\r\n    // Initialize with default values\r\n    this.nameInput.setValue('');\r\n    this.emailInput.setValue('');\r\n  }\r\n\r\n  isValid() {\r\n    return this.nameInput.validate() && this.emailInput.validate();\r\n  }\r\n\r\n  submit() {\r\n    if (this.isValid()) {\r\n      console.log('Submitting:', {\r\n        name: this.nameInput.value,\r\n        email: this.emailInput.value,\r\n      });\r\n    }\r\n  }\r\n}\r\n\r\n// 3. Input component\r\nconst InputModuleBp = ProviderModule.blueprint({\r\n  id: 'InputModule',\r\n  providers: [InputService],\r\n  exports: [InputService],\r\n});\r\n\r\nconst Input = provideModuleToComponent<{ label: string }>(InputModuleBp, ({ label }) => {\r\n  const inputService = useInject(InputService);\r\n  const [value, setValue] = useState(inputService.value);\r\n\r\n  return (\r\n    <div>\r\n      <label>{label}</label>\r\n      <input\r\n        value={value}\r\n        onChange={(e) => {\r\n          setValue(e.target.value);\r\n          inputService.setValue(e.target.value);\r\n        }}\r\n      />\r\n      {inputService.error && <span style={{ color: 'red' }}>{inputService.error}</span>}\r\n    </div>\r\n  );\r\n});\r\n\r\n// 4. Form component - injects its InputService instances into child Input components\r\nconst FormModuleBp = ProviderModule.blueprint({\r\n  id: 'FormModule',\r\n  imports: [\r\n    // Clone InputModuleBp and override its defaultScope to Transient for this specific use.\r\n    // Without Transient, both `nameInput` and `emailInput` in FormService would resolve to\r\n    // the same singleton — they'd share state. Transient ensures each @Inject(InputService)\r\n    // parameter in FormService's constructor gets its own independent instance.\r\n    // This is also a good showcase of blueprint dynamicity: the original InputModuleBp is\r\n    // left untouched, and only this consumer opts into Transient behavior.\r\n    InputModuleBp.clone().updateDefinition({\r\n      ...InputModuleBp.getDefinition(),\r\n      defaultScope: InjectionScope.Transient,\r\n    }),\r\n  ],\r\n  providers: [FormService],\r\n  exports: [FormService],\r\n});\r\n\r\nconst Form = provideModuleToComponent(FormModuleBp, () => {\r\n  const formService = useInject(FormService);\r\n\r\n  return (\r\n    <form>\r\n      {/* Pass the form's InputService instances to the inputs */}\r\n      <Input inject={[{ provide: InputService, useValue: formService.nameInput }]} label=\"Name\" />\r\n      <Input inject={[{ provide: InputService, useValue: formService.emailInput }]} label=\"Email\" />\r\n      <button type=\"button\" onClick={() => formService.submit()}>\r\n        Submit\r\n      </button>\r\n    </form>\r\n  );\r\n});\r\n```\r\n\r\n**What's happening here?**\r\n\r\n1. Each `Input` component normally gets its own `InputService`\r\n2. The `Form` component creates two `InputService` instances in its constructor\r\n3. The form **overrides** the input's services using the `inject` prop\r\n4. All inputs share state through the parent form's services\r\n\r\n## Testing Your Code\r\n\r\nxInjection makes testing easy. You can mock entire modules or individual services.\r\n\r\n### Mocking an Entire Module\r\n\r\n```tsx\r\nimport { act, render } from '@testing-library/react';\r\n\r\n// Original module\r\nconst UserModuleBp = ProviderModule.blueprint({\r\n  id: 'UserModule',\r\n  providers: [UserService, ApiService],\r\n});\r\n\r\n// Create a mocked version\r\nconst UserModuleMocked = UserModuleBp.clone().updateDefinition({\r\n  id: 'UserModuleMocked',\r\n  providers: [\r\n    {\r\n      provide: UserService,\r\n      useClass: UserServiceMock, // Your mock class\r\n    },\r\n    {\r\n      provide: ApiService,\r\n      useValue: {\r\n        get: vi.fn().mockResolvedValue({ name: 'Test User' }),\r\n        post: vi.fn(),\r\n      },\r\n    },\r\n  ],\r\n});\r\n\r\n// Test with the mocked module\r\nit('should render user data', async () => {\r\n  await act(async () => render(<UserProfile module={UserModuleMocked} />));\r\n\r\n  // Assert...\r\n});\r\n```\r\n\r\n### Mocking on-the-fly\r\n\r\n```tsx\r\nimport { act, render } from '@testing-library/react';\r\n\r\nit('should render user data', async () => {\r\n  await act(async () =>\r\n    render(\r\n      <UserProfile\r\n        inject={{\r\n          provide: ApiService,\r\n          useValue: {\r\n            get: vi.fn().mockResolvedValue({ name: 'Test User' }),\r\n            post: vi.fn(),\r\n          },\r\n        }}\r\n      />\r\n    )\r\n  );\r\n\r\n  // Assert...\r\n});\r\n```\r\n\r\n## FAQ\r\n\r\n### How do I add global services?\r\n\r\n**Recommended:** Use a global blueprint with `isGlobal: true` in your entry point — see [Quick Start](#quick-start) and [Modules: Organizing Dependencies](#2-modules-organizing-dependencies) for the full pattern.\r\n\r\n**For runtime additions**, use the built-in `AppModule` directly:\r\n\r\n```tsx\r\nimport { AppModule } from '@adimm/x-injection';\r\n\r\nAppModule.update.addProvider(ApiService, true); // true = also export\r\n```\r\n\r\n> [!WARNING]\r\n> The library provides a built-in `AppModule`. Don't create your own module named \"AppModule\"—use one of the methods above instead.\r\n\r\n### When should I use global modules vs component-scoped modules?\r\n\r\n**Global** (`isGlobal: true` + `exports`): API clients, auth state, routing, theme, toast notifications — accessed directly via `useInject` without a HoC.\r\n\r\n**Component-scoped** (blueprint without `isGlobal`): Form state, component-specific business logic, UI state — must use `provideModuleToComponent`; each instance gets its own module.\r\n\r\n### Can I use this with Redux/MobX/Zustand?\r\n\r\nYes! xInjection is state-library agnostic. Encapsulate your state management library inside a service:\r\n\r\n```tsx\r\n@Injectable()\r\nclass TodoStore {\r\n  private store = create<TodoState>(...);\r\n\r\n  get useStore() {\r\n    return this.store;\r\n  }\r\n\r\n  addTodo(text: string) {\r\n    this.store.setState(...);\r\n  }\r\n}\r\n```\r\n\r\n### How does this compare to React Context?\r\n\r\n| Feature                         | xInjection | React Context |\r\n| ------------------------------- | ---------- | ------------- |\r\n| Automatic dependency resolution | ✅         | ❌            |\r\n| Component-scoped instances      | ✅         | ❌            |\r\n| No provider hell                | ✅         | ❌            |\r\n| Parent-child dependency control | ✅         | ❌            |\r\n| Works with class-based logic    | ✅         | ❌            |\r\n| Testability                     | ✅         | ⚠️            |\r\n| TypeScript support              | ✅         | ⚠️            |\r\n\r\n### If I want Angular patterns, why not just use Angular?\r\n\r\nBecause you want React's component model, hooks, and ecosystem — but need better architecture for complex business logic. xInjection brings IoC/DI to React without the framework lock-in.\r\n\r\nThat said, if your app is simple, React Context + hooks is perfectly fine. xInjection shines in larger codebases with complex business logic, many modules, or a need for component-scoped service instances.\r\n\r\n### Can I migrate gradually from an existing React app?\r\n\r\nAbsolutely! Start with one component:\r\n\r\n1. Extract business logic into a service\r\n2. Create a module for that service\r\n3. Wrap the component with `provideModuleToComponent`\r\n\r\nYou can use xInjection alongside Context, Redux, or any other state management.\r\n\r\n### When do I actually need `provideModuleToComponent`?\r\n\r\n**Don't need it (just use `useInject`):** All your services are global/singleton — API client, auth service, theme service.\r\n\r\n**Need it:** You want multiple independent component instances (forms, modals, dialogs), or parent needs to control child dependencies via the `inject` prop.\r\n\r\nSee [Why Use the HoC Approach?](#why-use-the-hoc-approach) for a full explanation.\r\n\r\n### What's the performance impact?\r\n\r\nMinimal. The dependency container is lightweight, and services are created lazily (only when first requested). The HoC pattern has no performance overhead compared to standard React patterns.\r\n\r\n**Runtime vs Build-time:** This library works entirely at runtime (not build-time):\r\n\r\n- Runtime DI is more flexible (dynamic module loading, testing)\r\n- Performance impact is negligible (container operations are fast)\r\n- You get runtime debugging and introspection\r\n- Works with all bundlers/tools without special configuration\r\n\r\n### Why use classes for services instead of custom hooks?\r\n\r\nBoth approaches work! Here's when classes shine:\r\n\r\n**Classes are better for:**\r\n\r\n- Complex business logic (multiple methods, private state)\r\n- Dependency injection (automatic wiring)\r\n- Testing (easier to mock)\r\n- Encapsulation (private members, getters/setters)\r\n\r\n**Hooks are better for:**\r\n\r\n- Simple component logic\r\n- React-specific features (useState, useEffect)\r\n- Functional programming style\r\n\r\n**You can use both!** Use classes for services, hooks for UI logic. The `hookFactory` even lets you create hooks that inject class-based services.\r\n\r\n**Note:** Services are classes, but components are still functional! You write normal React functional components with hooks—only the business logic is in classes.\r\n\r\n## Links\r\n\r\n📚 **Full API Documentation:** [https://adimarianmutu.github.io/x-injection-reactjs](https://adimarianmutu.github.io/x-injection-reactjs/index.html)\r\n\r\n🔧 **Base Library:** [xInjection](https://github.com/AdiMarianMutu/x-injection)\r\n\r\n💡 **Issues & Feature Requests:** [GitHub Issues](https://github.com/AdiMarianMutu/x-injection-reactjs/issues)\r\n\r\n## Contributing\r\n\r\nContributions are welcome! Please:\r\n\r\n1. Fork the repository\r\n2. Create a feature branch\r\n3. Make your changes\r\n4. Add tests\r\n5. Submit a pull request\r\n\r\nPlease ensure your code follows the project's style and all tests pass.\r\n\r\n## License\r\n\r\nMIT © [Adi-Marian Mutu](https://www.linkedin.com/in/mutu-adi-marian/)\r\n\r\n---\r\n\r\nMade with ❤️ for the React community. If you find this library helpful, consider giving it a ⭐ on [GitHub](https://github.com/AdiMarianMutu/x-injection-reactjs)!\r\n","readmeFilename":"README.md"}