{"_id":"@opensumi/di","_rev":"33-1fcc56012b35eeea6d6c6e11a7edadd2","name":"@opensumi/di","dist-tags":{"beta":"1.6.0-beta.0","latest":"2.1.0"},"versions":{"1.0.0":{"name":"@opensumi/di","version":"1.0.0","keywords":["di","injector"],"_id":"@opensumi/di@1.0.0","maintainers":[{"name":"sakuraash","email":"binshao54@gmail.com"},{"name":"erha19","email":"faterrole@gmail.com"},{"name":"lengthmin","email":"lengthmin@gmail.com"}],"homepage":"https://github.com/opensumi/di#readme","bugs":{"url":"https://github.com/opensumi/di/issues"},"ci":{"type":"aci","version":"10"},"dist":{"shasum":"870e2fdd448b6a3af4cea79635afd82ce3aea3aa","tarball":"https://registry.npmjs.org/@opensumi/di/-/di-1.0.0.tgz","fileCount":48,"integrity":"sha512-QZur3A/uzwqXnvLR4X+FM6dowqw/wlZYXRkO5/6NVV6UIZ7/LXVb1L+pddGjOS0C36dBzyFapUnnHdfr6WQcFw==","signatures":[{"sig":"MEYCIQDucCHoYMRRUfLWMec3HKDvyYsM0HiTNsLIe23dAUFguwIhAL+NzeRKDDTUGr6uQZ5sUfoqPEkv61DcG1lcu7NntsFm","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":152192,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhnl0bCRA9TVsSAnZWagAAD5kQAJtvxTzgzGTDjmXmlNEW\nfJSU3o/xcfH/Fwxr890RI+z9ZvJg+pj1RsYWsyKmtmH5wn0d3ENpeok5L8ld\nMneV03PT/m36yTnHrHVD8seCpZsXnZAkm0K+XK3PtR9OY+t7wtqfx4oa/31V\noetLh+LTJPq/29yoxDPDJ0FP3c8BX4rrWIP+K9Qwep8bgiMv9Ng00SBf3uic\nHtLYc8lfTziDBhCjMXm5U90VkCZPx7J7qfj1WdIq1KIBybrgWH4LGB0HaXg4\n9CgNPIKePgPxnHI11xNnenAzkfglt+MwlTX5+srtxpCOZwqGEShPmOU4qvre\nIGPkfT9Po1bdERNiznUzwaIGhl0NvIV7Cfz660xsk7eiUjU8tyAH/hdpcheZ\nz4eU8gyvkIiW9sxnO0Z5DbLuI6o6tWMGBhL7lSjQB0dl5CdpPWyMtzHtxMsy\nFLeJnqZZi5ZlojFL0rzXzoosh0MW4IoUratqPTYCtKHVThgh2X+KPLKrC2Va\nsg6mjcpZmgYvvfQcljA1agD/QncehfLufqvxfLkphavAmZotrIAn6+ZpLNTS\nu40RGccryQuo/VMpky+p+KQnA6maSdt2wMaEZvrST0s1CrxN9vi9fQT9OdqQ\nxa8YKJA86tVVg7b/HVBeP2Xyf8+0EIYtjwD5WFH0farFq+lbCrnC/Z6AgToj\n9XYr\r\n=8lCX\r\n-----END PGP SIGNATURE-----\r\n"},"jest":{"preset":"ts-jest","testEnvironment":"node","coverageThreshold":{"global":{"lines":10,"branches":10,"functions":10,"statements":10}},"coveragePathIgnorePatterns":["/node_modules/","/test/"]},"main":"dist/index.js","husky":{"hooks":{"commit-msg":"commitlint -E HUSKY_GIT_PARAMS","pre-commit":"lint-staged"}},"config":{"commitizen":{"path":"node_modules/cz-conventional-changelog"}},"engines":{"node":">=8.0.0"},"gitHead":"0e267a835778d6204236d410d03a948e2b45b18a","scripts":{"ci":"npm run lint && npm run test","tsc":"rm -rf dist && tsc -p tsconfig.prod.json","lint":"tslint -p tsconfig.json -t stylish","test":"jest --coverage","commit":"git-cz","release":"standard-version","prerelease":"npm run lint && npm run test && npm run tsc ","test:watch":"jest --coverage --watch","release:beta":"npm run release -- --prerelease beta"},"_npmUser":{"name":"erha19","email":"faterrole@gmail.com"},"commitlint":{"extends":["@commitlint/config-conventional"]},"repository":{"url":"git+ssh://git@github.com/opensumi/di.git","type":"git"},"_npmVersion":"6.14.15","description":"Dependency injector.","directories":{},"lint-staged":{"*.ts":"tslint -p tsconfig.json -t stylish"},"_nodeVersion":"12.22.7","dependencies":{"tslib":"^1.9.3","reflect-metadata":"^0.1.12"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^26.0.0","husky":"^1.2.1","tslint":"^5.11.0","ts-jest":"^26.0.0","commitizen":"^3.0.5","commitlint":"^7.2.1","typescript":"^3.2.2","@types/jest":"^26.0.0","@types/node":"^10.17.26","lint-staged":"^8.1.0","@commitlint/cli":"^7.2.1","standard-version":"^4.4.0","cz-conventional-changelog":"^2.1.0","@commitlint/config-conventional":"^7.1.2"},"_npmOperationalInternal":{"tmp":"tmp/di_1.0.0_1637768475662_0.8055168228616596","host":"s3://npm-registry-packages"}},"1.0.1":{"name":"@opensumi/di","version":"1.0.1","keywords":["di","injector"],"_id":"@opensumi/di@1.0.1","maintainers":[{"name":"jinboker","email":"jinboker@foxmail.com"},{"name":"ensorrow","email":"1121264060@qq.com"},{"name":"sakuraash","email":"binshao54@gmail.com"},{"name":"erha19","email":"faterrole@gmail.com"},{"name":"lengthmin","email":"lengthmin@gmail.com"}],"homepage":"https://github.com/opensumi/di#readme","bugs":{"url":"https://github.com/opensumi/di/issues"},"ci":{"type":"aci","version":"10"},"dist":{"shasum":"7fa6574d76f80e67c004169b4ef071beec99df38","tarball":"https://registry.npmjs.org/@opensumi/di/-/di-1.0.1.tgz","fileCount":20,"integrity":"sha512-tKkk4tuDAEwUFUuTAklkVKXjK4DYDyfnGYnlfBMW2ueZYjF/+rylljIzgd/mPGc41BpVeWim4KlVPJvFhPKYDQ==","signatures":[{"sig":"MEYCIQDCP4+tCG/WFwkFJUxTw/1pr4i6HVsxQvLVh4hyKXnDIwIhAKYlSlTjt9xOUWhFOfIeoEu7shIgnWOr2ZRzFca3A8/B","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":68248,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhuAhUCRA9TVsSAnZWagAAu9AQAI22oBgEtjptuLewoy8j\nQjDL11Zup1lkvAC8Jaeg6r9t8UCGrivwTTFK61ukx0f1N0fG3s9t35lodMfp\noZDTJc60XQF0MYdZMDcXBJqI9n2zu6S3OCfEn+xGNgaD8C8YLAtTiqNHKmkE\n88gTMOR62QXwq/yIPQWr1SSsZPUU92i5agtaoFBaI+4rAwWF+K366QpiQ+K/\nW6hQ8P1jcRRKLalp4ij3E8R4loYncgWFuvhkFn3MYr/jd9MiOnRumIy86Esa\n2MJI6rk2J5Qoi9gT3irMrvHI9ZyAzKHVIMrAQgPMivwln1JZWA/+AE4nPrc5\n48YUk+kzzW4A0iAI5nA91i9X4k1HL4KRv0CtnN2FdSa8YVVg+PM20WPBq2B6\nIri2fZhX/fjcBRVNEDuyMe+xfdJVXbuiYCha+BeydgrF3ifJ+kn8CbGAfc0s\nwt+rlrc4mKsB96YbhiGkcdtrDXWf2CYjsWL5qmrmvWQzEwP8Bs0hT2Xi9Zde\nV4WGRODt7Z5gpbkn0Md3vj7VLIpV59sJDrW4TMJmMQsqTDCvzyufhjf0U73d\nM1D71B8+t6Vjf5BbV9kWGgK3w7klPfcMMi957uCaWavx6L29mzJo+l2l1x2T\nhF2bWvA9kWpN+v5veWkyJqL7BtBgTmSBnnVIAK3a0HWSJIqihDbWZ3cVo571\nYTeb\r\n=+mtu\r\n-----END PGP SIGNATURE-----\r\n"},"jest":{"preset":"ts-jest","testEnvironment":"node","coverageThreshold":{"global":{"lines":10,"branches":10,"functions":10,"statements":10}},"coveragePathIgnorePatterns":["/node_modules/","/test/"]},"main":"dist/index.js","husky":{"hooks":{"commit-msg":"commitlint -E HUSKY_GIT_PARAMS","pre-commit":"lint-staged"}},"config":{"commitizen":{"path":"node_modules/cz-conventional-changelog"}},"engines":{"node":">=8.0.0"},"gitHead":"a7b69a5cb31db16ae401f6591ffeb7ae7c81b987","scripts":{"ci":"npm run lint && npm run test","tsc":"rm -rf dist && tsc -p tsconfig.prod.json","lint":"tslint -p tsconfig.json -t stylish","test":"jest --coverage","commit":"git-cz","release":"standard-version","prerelease":"npm run lint && npm run test && npm run tsc ","test:watch":"jest --coverage --watch","release:beta":"npm run release -- --prerelease beta"},"_npmUser":{"name":"jinboker","email":"jinboker@foxmail.com"},"commitlint":{"extends":["@commitlint/config-conventional"]},"repository":{"url":"git+ssh://git@github.com/opensumi/di.git","type":"git"},"_npmVersion":"6.14.15","description":"Dependency injector.","directories":{},"lint-staged":{"*.ts":"tslint -p tsconfig.json -t stylish"},"_nodeVersion":"14.18.0","dependencies":{"tslib":"^1.9.3","reflect-metadata":"^0.1.12"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^26.0.0","husky":"^1.2.1","tslint":"^5.11.0","ts-jest":"^26.0.0","commitizen":"^3.0.5","commitlint":"^7.2.1","typescript":"^3.2.2","@types/jest":"^26.0.0","@types/node":"^10.17.26","lint-staged":"^8.1.0","@commitlint/cli":"^7.2.1","standard-version":"^4.4.0","cz-conventional-changelog":"^2.1.0","@commitlint/config-conventional":"^7.1.2"},"_npmOperationalInternal":{"tmp":"tmp/di_1.0.1_1639450707863_0.5188580021622","host":"s3://npm-registry-packages"}},"1.1.0-beta.0":{"name":"@opensumi/di","version":"1.1.0-beta.0","keywords":["di","injector"],"_id":"@opensumi/di@1.1.0-beta.0","maintainers":[{"name":"jinboker","email":"jinboker@foxmail.com"},{"name":"ensorrow","email":"1121264060@qq.com"},{"name":"sakuraash","email":"binshao54@gmail.com"},{"name":"erha19","email":"faterrole@gmail.com"},{"name":"lengthmin","email":"lengthmin@gmail.com"}],"homepage":"https://github.com/opensumi/di#readme","bugs":{"url":"https://github.com/opensumi/di/issues"},"ci":{"type":"aci","version":"10"},"dist":{"shasum":"f08d5b299789287e5df49168f45d5cdf37ae2ad2","tarball":"https://registry.npmjs.org/@opensumi/di/-/di-1.1.0-beta.0.tgz","fileCount":49,"integrity":"sha512-zfoDFp3lDK+39WUQxKk5Axzi/OjO7H2pBPd1oRVVb5dqCr8wrNaZzbd12OVKUAb50CZACwHirqGxD/SH5TTGpQ==","signatures":[{"sig":"MEQCIDfPtptmepNKtK5ZBtsG37oEAGyYns6PgGRmqfw0ik2cAiBCFSYG79FnQV/D8OPM7zYI8sCHOS7oG31SRcQFXAtOTA==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":152347,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhuCxhCRA9TVsSAnZWagAAA2kQAIzMKOcruId+ufjy6G0y\nE4r32QcOq/Y3n6tfXByUKhX2u22Uu0dMOOFts/7xFddpy1GbOVIm1op1cuQ1\ngbgh2z0F7f8YWiC/try4hcd6ExGRo04RiQNKfsElQkh67G+i3Vh7RJm2Kkzi\n2dkVpQSk5bxB9nKhC8fv+lL9djZWFyGjkjgz7Qk8j/UbxhA8EB0tH3HpMRw1\nqAqRxCAyyH87MI474NrDSew6UZoVS4yjEG7A7fc+BoBBw/bbhfqmYo+cayqD\ntByFiUTsOlKP4ZhvuFHfyuRoUoIGO8Lhwtx4bLsdGUXbOA8LX9bJW6TIPqcT\nk9sFQO6bMM6U14eoQzHFwF+EH902a7+bQL2Mbp4e6e68Lx4S5gzMQyR+UCcu\nCmpSlKGlRLjo+Q5uE8UiR9kc0aboqKW9eC5in/DKuE/MnuRDwajtSnoils+Z\nfOs6PyB9Wh9RRVpa9vokm8UHYJvKAGIw2Gq+xQsK8IwE3mtZJ0PL3OEKHcQS\n9qZ09zECpctahcUYd0ZBz1wx1xtgfTASzerYkCrC7qvTQL0WsgmxSB0UPBty\nE3P5i5IPs4Uet7vnrMBfTn4qGB2QxLXbtwkF0XTGO+HRXDvafpnkDCclcStO\n3Xuuwt3oRhVPlx+Hv1e2M9DhLNHB8QxbHIbKp18Joti+qiHZktg6lNKBBcli\nZgSz\r\n=H9Vm\r\n-----END PGP SIGNATURE-----\r\n"},"jest":{"preset":"ts-jest","testEnvironment":"node","coverageThreshold":{"global":{"lines":10,"branches":10,"functions":10,"statements":10}},"coveragePathIgnorePatterns":["/node_modules/","/test/"]},"main":"dist/index.js","husky":{"hooks":{"commit-msg":"commitlint -E HUSKY_GIT_PARAMS","pre-commit":"lint-staged"}},"config":{"commitizen":{"path":"node_modules/cz-conventional-changelog"}},"engines":{"node":">=8.0.0"},"gitHead":"857174ea7c4757c34c1f5dafcd260f053aa1b72d","scripts":{"ci":"npm run lint && npm run test","tsc":"rm -rf dist && tsc -p tsconfig.prod.json","lint":"tslint -p tsconfig.json -t stylish","test":"jest --coverage","commit":"git-cz","release":"standard-version","prerelease":"npm run lint && npm run test && npm run tsc ","test:watch":"jest --coverage --watch","release:beta":"npm run release -- --prerelease beta"},"_npmUser":{"name":"jinboker","email":"jinboker@foxmail.com"},"commitlint":{"extends":["@commitlint/config-conventional"]},"repository":{"url":"git+ssh://git@github.com/opensumi/di.git","type":"git"},"_npmVersion":"6.14.15","description":"Dependency injector.","directories":{},"lint-staged":{"*.ts":"tslint -p tsconfig.json -t stylish"},"_nodeVersion":"14.18.0","dependencies":{"tslib":"^1.9.3","reflect-metadata":"^0.1.12"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^26.0.0","husky":"^1.2.1","tslint":"^5.11.0","ts-jest":"^26.0.0","commitizen":"^3.0.5","commitlint":"^7.2.1","typescript":"^3.2.2","@types/jest":"^26.0.0","@types/node":"^10.17.26","lint-staged":"^8.1.0","@commitlint/cli":"^7.2.1","standard-version":"^4.4.0","cz-conventional-changelog":"^2.1.0","@commitlint/config-conventional":"^7.1.2"},"_npmOperationalInternal":{"tmp":"tmp/di_1.1.0-beta.0_1639459937824_0.4965887528187449","host":"s3://npm-registry-packages"}},"1.1.0":{"name":"@opensumi/di","version":"1.1.0","keywords":["di","injector"],"_id":"@opensumi/di@1.1.0","maintainers":[{"name":"jinboker","email":"jinboker@foxmail.com"},{"name":"ensorrow","email":"1121264060@qq.com"},{"name":"sakuraash","email":"binshao54@gmail.com"},{"name":"erha19","email":"faterrole@gmail.com"},{"name":"lengthmin","email":"lengthmin@gmail.com"}],"homepage":"https://github.com/opensumi/di#readme","bugs":{"url":"https://github.com/opensumi/di/issues"},"ci":{"type":"aci","version":"10"},"dist":{"shasum":"18320bc5cb7f39092b1540320fb2bb397291cbaf","tarball":"https://registry.npmjs.org/@opensumi/di/-/di-1.1.0.tgz","fileCount":49,"integrity":"sha512-O4dho1UcUDch4LLrDRr2GhIHGNZ7tw86tughGMdjTpJ+rNWr8MHJUGWT3N+qcYLl0trxoCCSRy93QvE1DiVVcw==","signatures":[{"sig":"MEQCIElm3PEwPKhv5zm2PYvCO+VeXnePFcRpD7eLV31tP5rDAiAtxFR9n9QohTebL1pd6smFoa/bANQeirhPKnxK+ULa8A==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":152326,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhuDG9CRA9TVsSAnZWagAAkCAP/2g/7dBrgaHlZ6hBClYX\nDIBBCil2oXso8b3+5siH+IBudrcS3TT78dfVYRtlXNWJonps2EGl2ZmiPfoU\nuqypr2itUwog+0hprz+8hpCwfuM1pvbfPUp+RBd/2pdYw+a/McsXuYufhax0\nbhqVkIyW12y0xPhJJPwN1/MZOaCR9lVmFrlQsFOlEfNUo4AoCLKAMBzCDW9o\n01HbLCRV2Z7EH5Mt8qv0Rl6omrzDa/jWrIMfdXisjHHyAxA8tf/14NHCfxtY\n3AqDtLvUhN1P/pgakIXmU05Bu2Sz+uXWoH2JIgx+WMwE06ltCckG30EMTiVn\n8/CZJHHyQqt0LHunAYwwa+0p41aDxmlZ5mw5UIwo7YHy7hWKeA4Ffripfo4D\nWRE1rBpau1VwdP45Yn5w2V4z7/VZMHx0FACCtrp3hHc96BSoKqQy5pSWhBNw\npNz11p2OMwG7yoFgvcoVlnFadZM3UHhpzPwg39Iob4Olu7CO8UwoKUop2T9e\n4rMv1QeDmlZBYVVVHVIvADk+ocEviqTm4uuDmUtVRI31d3gaF8gfbVP7LsZP\nHnsekPTnptfTA9c6eILuhvOz/9t53a5TGzprsnEp3gNiJWcgDdvdHijIb4Hs\nturaFPEtoS5HJZKRgpeUw0/EcQ98Taqf4AW2P/63Vx6Oh+4YLwntIhh2vyae\nrL6K\r\n=fYoQ\r\n-----END PGP SIGNATURE-----\r\n"},"jest":{"preset":"ts-jest","testEnvironment":"node","coverageThreshold":{"global":{"lines":10,"branches":10,"functions":10,"statements":10}},"coveragePathIgnorePatterns":["/node_modules/","/test/"]},"main":"dist/index.js","husky":{"hooks":{"commit-msg":"commitlint -E HUSKY_GIT_PARAMS","pre-commit":"lint-staged"}},"config":{"commitizen":{"path":"node_modules/cz-conventional-changelog"}},"engines":{"node":">=8.0.0"},"gitHead":"7160bef0d554636a21d3b1661bedb1ccc6003d5b","scripts":{"ci":"npm run lint && npm run test","tsc":"rm -rf dist && tsc -p tsconfig.prod.json","lint":"tslint -p tsconfig.json -t stylish","test":"jest --coverage","commit":"git-cz","release":"standard-version","prerelease":"npm run lint && npm run test && npm run tsc ","test:watch":"jest --coverage --watch","release:beta":"npm run release -- --prerelease beta"},"_npmUser":{"name":"jinboker","email":"jinboker@foxmail.com"},"commitlint":{"extends":["@commitlint/config-conventional"]},"repository":{"url":"git+ssh://git@github.com/opensumi/di.git","type":"git"},"_npmVersion":"6.14.15","description":"Dependency injector.","directories":{},"lint-staged":{"*.ts":"tslint -p tsconfig.json -t stylish"},"_nodeVersion":"14.18.0","dependencies":{"tslib":"^1.9.3","reflect-metadata":"^0.1.12"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^26.0.0","husky":"^1.2.1","tslint":"^5.11.0","ts-jest":"^26.0.0","commitizen":"^3.0.5","commitlint":"^7.2.1","typescript":"^3.2.2","@types/jest":"^26.0.0","@types/node":"^10.17.26","lint-staged":"^8.1.0","@commitlint/cli":"^7.2.1","standard-version":"^4.4.0","cz-conventional-changelog":"^2.1.0","@commitlint/config-conventional":"^7.1.2"},"_npmOperationalInternal":{"tmp":"tmp/di_1.1.0_1639461309526_0.9780857595300674","host":"s3://npm-registry-packages"}},"1.3.0":{"name":"@opensumi/di","version":"1.3.0","keywords":["di","injector"],"license":"MIT","_id":"@opensumi/di@1.3.0","maintainers":[{"name":"ricbet","email":"18676769065@163.com"},{"name":"hacke2","email":"hacke2cn@gmail.com"},{"name":"jinboker","email":"jinboker@foxmail.com"},{"name":"ensorrow","email":"1121264060@qq.com"},{"name":"sakuraash","email":"binshao54@gmail.com"},{"name":"erha19","email":"faterrole@gmail.com"},{"name":"lengthmin","email":"lengthmin@gmail.com"}],"homepage":"https://github.com/opensumi/di#readme","bugs":{"url":"https://github.com/opensumi/di/issues"},"dist":{"shasum":"796d2e269130a9702f3464576548c6691bd3baf9","tarball":"https://registry.npmjs.org/@opensumi/di/-/di-1.3.0.tgz","fileCount":32,"integrity":"sha512-WPzCjy4UPWCvZIkAWqdGonuKp4cemD/xJUNpfOPrWGozek+ImW9IU7pKEGKCCQ77p5S2TaUWgN04ZwlU3s541g==","signatures":[{"sig":"MEUCIQDETSNOXfOdv2SV4eHPPhMiYZZF+LYq6dtFmOVmoBGU2gIgC+U59d4XHKey6t7p7DdXs6A4J7BlrkmzSlrpVmMy+jM=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":97402,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJic75vACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqoGA//ayxYETMmIFXBPh/AEp85xL2UIWKsddr1nNtmHWSDo6R+PhH2\r\ns4TGJnxWSor9PRcIyEy1SogPBue/54zOBk+AQLZG2ozIb7pGfSxmcY9LMYS7\r\n0XDORLfwPkb7lJ5xXr/EZfQ1zK9tEmQlSydwqiwYONS2OCHQdenHtgHXe/C1\r\nr9lLEwLzzwUZKSSN8d8+98+3XFcsjRgk2rLT3nYi8er1uYmdDFEPWoiYrNS4\r\nk7EmC/wzaN8MYmbocnyiGKe5C2ug6i6yvqQ4v0ZWgjnYBZVWpRAQOEJ2HcqG\r\n2/OxbG28igX7fMibqWk5u2nxYSRajtg1uyg5Uh0ZfzFjJ/ySLnZIQWKxndIz\r\nwCUCImpzSf2ORdzxLN9+wgM0EQtDm2/xy178NQVjUehevBOcCesBPBRia3Iq\r\nha110HwLBS/UU8vbUS6jlIyU4C4vsfwkjO5OYDv0fzPW4SMOkUXfXYIMhv1p\r\na6nPRY01vY9pc7CotCc05WdEasF5uh7LZu1+aYsGe2VWNP1ELePihZkYHOds\r\nDxnxcgNIXAVDeP0x6CJEOvd2QL7P1N1zHNSrZ36XT3s8prtcbO45RxwY1Zmz\r\nqZ5ox+k8u/dlw9X4UUDSlBkoedhJY3D5+S4wroeRsJkqwuIKP/CIFtk8swvQ\r\nmq5dkgzyzHg++KFLwbFmgvT8b95tI7zyyd8=\r\n=hk04\r\n-----END PGP SIGNATURE-----\r\n"},"jest":{"preset":"ts-jest","testEnvironment":"node","coverageThreshold":{"global":{"lines":10,"branches":10,"functions":10,"statements":10}},"coveragePathIgnorePatterns":["/node_modules/","/test/"]},"main":"dist/index.js","config":{"commitizen":{"path":"node_modules/cz-conventional-changelog"}},"engines":{"node":">=8.0.0"},"gitHead":"5ba2a30893fe0d9a221802b5c8ad58ba9ac6c81d","scripts":{"ci":"npm run lint && npm run test","tsc":"rm -rf dist && tsc -p tsconfig.prod.json","lint":"eslint . --ext .js,.jsx,.ts,.tsx","test":"jest --coverage test/**","commit":"git-cz","prepare":"husky install","release":"standard-version","prerelease":"npm run lint && npm run test && npm run tsc ","test:watch":"yarn test --watch","release:beta":"npm run release -- --prerelease beta"},"_npmUser":{"name":"lengthmin","email":"lengthmin@gmail.com"},"commitlint":{"extends":["@commitlint/config-conventional"]},"repository":{"url":"git+ssh://git@github.com/opensumi/di.git","type":"git"},"_npmVersion":"6.14.15","description":"A dependency injection tool for Javascript.","directories":{},"lint-staged":{"*.ts":["eslint --fix","prettier --write"]},"_nodeVersion":"14.18.1","dependencies":{"tslib":"^2.4.0","reflect-metadata":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^28.0.3","husky":"^7.0.4","eslint":"^8.14.0","ts-jest":"^28.0.1","prettier":"2.6.2","commitizen":"^4.2.4","commitlint":"^16.2.4","typescript":"^4.6.4","@types/jest":"^27.5.0","@types/node":"^17.0.31","lint-staged":"^12.4.1","@commitlint/cli":"^16.2.4","standard-version":"^9.3.2","eslint-config-prettier":"^8.5.0","@typescript-eslint/parser":"^5.22.0","cz-conventional-changelog":"^3.3.0","@commitlint/config-conventional":"^16.2.4","@typescript-eslint/eslint-plugin":"^5.22.0"},"_npmOperationalInternal":{"tmp":"tmp/di_1.3.0_1651752558999_0.37606459470089515","host":"s3://npm-registry-packages"}},"1.3.1":{"name":"@opensumi/di","version":"1.3.1","keywords":["di","injector"],"license":"MIT","_id":"@opensumi/di@1.3.1","maintainers":[{"name":"ricbet","email":"18676769065@163.com"},{"name":"hacke2","email":"hacke2cn@gmail.com"},{"name":"jinboker","email":"jinboker@foxmail.com"},{"name":"ensorrow","email":"1121264060@qq.com"},{"name":"sakuraash","email":"binshao54@gmail.com"},{"name":"erha19","email":"faterrole@gmail.com"},{"name":"lengthmin","email":"lengthmin@gmail.com"}],"homepage":"https://github.com/opensumi/di#readme","bugs":{"url":"https://github.com/opensumi/di/issues"},"dist":{"shasum":"53733bf809d981a2540f60605464175baee5b532","tarball":"https://registry.npmjs.org/@opensumi/di/-/di-1.3.1.tgz","fileCount":32,"integrity":"sha512-7ntvNFmcsm2ItTEZWPbbhMNvBzTyG3iqmzj2h2sMbthcRv2rR4hJvo3xZeMBd8De+tetgU49c/KBRF0UxpWFeg==","signatures":[{"sig":"MEQCIBwfkGuqYvxSe0q9f3zf2zLM0jrioYBLVtW78jzIjZjvAiBoAbT1+YsVwWy4YoR28sdRR18NJN09HvBjMjhqr/sV6Q==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":108443,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJidO9wACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmp0Kw//dvyct34kgR/hMqIMv0RyNHDOdSHthcH3t5NA6tUlWZcw2zb/\r\nesnrbHtRYZM+Z5/lWmGL1QWiFFcTBTgHOkwqxGKs3LWsrA3yAtO0Bg9WMhBH\r\nQtqB641EVUPVhZZIM1RUwgdzKdsGjItGltJo0qGU5T6aV8exZELgqgvVK37J\r\n4zsJ3B92UebIhwigvf/z+CMsdIv5Q2/YgsaRgChmpYRKl9c4OqotEuc/OiVm\r\nfaVn8Cl5M/5RzIa4KZBwWEkIheIu8+VsdVkja2hiWqch0d4NKerP5VBfG/mM\r\nE4dkOut5IXl9N34bw5lK96Yrr7+FUhCd3CUzQvCdZoKgfCft/Df3/jZEIm5i\r\nI4LbuUeN7KiGMMCeYZjUX2yRciE5aVhi3OQ9N1XG17z3Wucgf++E+EfD+W29\r\n763uUzhp7mrjPPlBOAU8E6ns3o4+eZwAxlOjE3naYEOxgcaDz0bTI2IF8gW/\r\niLGMBWGvgzWhvOJLgjs5c7D+nTXeSp9TVgMJ5wJ/0by8lPmN+H1oVR9eWpQG\r\nVTNWmrCERjkaQmqzdV/5s+JKYYLGuR3V9ndusOSY3hxUOxXB4hTvkX9Z+Fi1\r\noL1zPjeqLayBGAL2K9sziDaHFEomajtAJDG2pqZAy++dJkKp1T6w0WrZGZko\r\nCOng833LE4HL4gRfK+Gr8fey6Tddu9rvTbc=\r\n=bjBM\r\n-----END PGP SIGNATURE-----\r\n"},"jest":{"preset":"ts-jest","testEnvironment":"node","coverageThreshold":{"global":{"lines":10,"branches":10,"functions":10,"statements":10}},"coveragePathIgnorePatterns":["/node_modules/","/test/"]},"main":"dist/index.js","config":{"commitizen":{"path":"node_modules/cz-conventional-changelog"}},"engines":{"node":">=8.0.0"},"gitHead":"1615efccef5bc8796cb0cc588222140149697f00","scripts":{"ci":"npm run lint && npm run test","tsc":"rm -rf dist && tsc -p tsconfig.prod.json","lint":"eslint . --ext .js,.jsx,.ts,.tsx","test":"jest --coverage test/**","commit":"git-cz","prepare":"husky install","release":"standard-version","prerelease":"npm run lint && npm run test && npm run tsc ","test:watch":"yarn test --watch","release:beta":"npm run release -- --prerelease beta"},"_npmUser":{"name":"lengthmin","email":"lengthmin@gmail.com"},"commitlint":{"extends":["@commitlint/config-conventional"]},"repository":{"url":"git+ssh://git@github.com/opensumi/di.git","type":"git"},"_npmVersion":"6.14.15","description":"A dependency injection tool for Javascript.","directories":{},"lint-staged":{"*.ts":["eslint --fix","prettier --write"]},"_nodeVersion":"14.18.1","dependencies":{"reflect-metadata":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^28.0.3","husky":"^7.0.4","eslint":"^8.14.0","ts-jest":"^28.0.1","prettier":"2.6.2","commitizen":"^4.2.4","commitlint":"^16.2.4","typescript":"^4.6.4","@types/jest":"^27.5.0","@types/node":"^17.0.31","lint-staged":"^12.4.1","@commitlint/cli":"^16.2.4","standard-version":"^9.3.2","eslint-config-prettier":"^8.5.0","@typescript-eslint/parser":"^5.22.0","cz-conventional-changelog":"^3.3.0","@commitlint/config-conventional":"^16.2.4","@typescript-eslint/eslint-plugin":"^5.22.0"},"_npmOperationalInternal":{"tmp":"tmp/di_1.3.1_1651830640551_0.0933275308942687","host":"s3://npm-registry-packages"}},"1.4.0-beta.0":{"name":"@opensumi/di","version":"1.4.0-beta.0","keywords":["di","injector"],"license":"MIT","_id":"@opensumi/di@1.4.0-beta.0","maintainers":[{"name":"ricbet","email":"18676769065@163.com"},{"name":"hacke2","email":"hacke2cn@gmail.com"},{"name":"jinboker","email":"jinboker@foxmail.com"},{"name":"ensorrow","email":"1121264060@qq.com"},{"name":"sakuraash","email":"binshao54@gmail.com"},{"name":"erha19","email":"faterrole@gmail.com"},{"name":"lengthmin","email":"lengthmin@gmail.com"}],"homepage":"https://github.com/opensumi/di#readme","bugs":{"url":"https://github.com/opensumi/di/issues"},"dist":{"shasum":"6181c62431fbcbf284f2a6969f26df6c81780059","tarball":"https://registry.npmjs.org/@opensumi/di/-/di-1.4.0-beta.0.tgz","fileCount":34,"integrity":"sha512-cCdZecOdjpVcI1DaSOSfViJIDYFRjT52myFhPb4WLJ0EPoc4+LUjo14q43Fj4kLeJwcyGf+O1aWMNYao7UFEWQ==","signatures":[{"sig":"MEUCIQDuXV2CtR6IwihrNLqTKBSKEBVLbqyM0S5pVMROXMuQQgIgBsnFdHhSaYpqLr0E+6G0KaaWGnWSyiOKSZMk9kUqkxk=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":110472,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJijN9qACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmpwpw/8CiJqnUS7oPQprPm5xwBi3pp+7fwpa6lSuRV/vM17K8a6akBc\r\nPvq/zpPXShAO95UapYeR60dlccbo49f9sq02kVMA1cW2vaNOUn2bjgUOeoZr\r\nkHjrTGzm1+JXmNmiVTzh7n0ich7EXRfkKmE1KzjIzAAEAotb3dspNbnNf7/F\r\n1kTaCH+Eq3TnRYAmsI5wSq6nT26LoeNIa44iX5JjqJqBs3V7WXZJmcoS3QNO\r\nlsuhN2kxbX6xgug2FyJdbd83Gzze3rgQE1yfYNUdR2OsdvgYpTFjz2aRd79W\r\nLlXYkOt6HzuQJ0VwuieV1YjhrWpTRqjlRCNbXjSUwGZ2ZXLKY1kav5RJ2wc5\r\nZvn6CW6mOMOa0mIsyQvUhno3IhLz/KAWxCpdYKonCHOCbKuHioRogTJNHSLW\r\nlDeAxQvklCgVi4l2dKflEtNd7849FUsgQYEy2PX/g6NK+kbxvYkccEASDYqi\r\nLKtuQFVaGG/9bCxAvJy6sJ/D/nMoHRYZXrLAZZWBI6D4JwxVs8748gEe/6uH\r\nzpdnoJlJnWrx+Hj+k+C7KA2pfFAO+dyPUNIEdIA8ZL5AuMSEO+wz0UPCebKT\r\nlXa9X9T+voK6fji1lq5AjxpSirPtQMlx0mDzQjb74oenPwtrey/IB5f4ucUo\r\nJEHpmOJUT2K3KRciN54fXa3kwEzzSdhPQMM=\r\n=xfj/\r\n-----END PGP SIGNATURE-----\r\n"},"jest":{"preset":"ts-jest","testEnvironment":"node","coverageThreshold":{"global":{"lines":10,"branches":10,"functions":10,"statements":10}},"coveragePathIgnorePatterns":["/node_modules/","/test/"]},"main":"dist/index.js","config":{"commitizen":{"path":"node_modules/cz-conventional-changelog"}},"readme":"# @opensumi/di\n\n[![CI](https://github.com/opensumi/di/actions/workflows/ci.yml/badge.svg)](https://github.com/opensumi/di/actions/workflows/ci.yml)\n[![NPM Version][npm-image]][npm-url]\n[![NPM downloads][download-image]][download-url]\n[![Test Coverage][test-image]][test-url]\n[![License][license-image]][license-url]\n\n[npm-image]: https://img.shields.io/npm/v/@opensumi/di.svg\n[npm-url]: https://www.npmjs.com/package/@opensumi/di\n[download-image]: https://img.shields.io/npm/dm/@opensumi/di.svg\n[download-url]: https://npmjs.org/package/@opensumi/di\n[license-image]: https://img.shields.io/npm/l/@opensumi/di.svg\n[license-url]: https://github.com/opensumi/di/blob/main/LICENSE\n[test-image]: https://codecov.io/gh/opensumi/di/branch/main/graph/badge.svg?token=07JAPLU957\n[test-url]: https://codecov.io/gh/opensumi/di\n\n> 基于 [Angular DI](https://angular.io/guide/dependency-injection) 的设计实现的依赖注入工具。\n\n如果你想在项目中使用工厂模式或者依赖反转，那么必不可少的需要一个依赖注入的工具。这个工具将会帮助你很好的帮助你实现依赖反转，而不在关系那些对象实例化的细节。同时，因为对象的实例化在注册器中进行创建，所以单例模式也很容易在这里实现。\n\n## Table of Contents\n\n- [Background](#background)\n- [Install](#install)\n- [Usage](#usage)\n- [API](#API)\n- [Example Readmes](#example-readmes)\n- [Related Efforts](#related-efforts)\n\n## Background\n\n出于对于 DI 的需要，并且调研市场上的 DI 工具，都有一些不太满意的地方，所以写了一个工具来实现 Angular 定义的 DI 模式。\n\n- Inversify.Js 用法太过于死板，显示的 Token 模式，导致要写很多代码，相较于 API 还是 Angular 的 Token 和 Provider 的设计更容易理解。\n- injection-js 从 Angular 抽离出来的 DI 工具，因为具有 Angular 的 Module 设计，一般的 DI 是不需要要的。\n\n### Token\n\n查找实例的唯一标记，类型描述如下：\n\n```ts\nexport type Token = string | symbol | Function;\n```\n\n### Provider\n\n为 Token 提供实例的定义，一共有四种类型的 Provider 定义：\n\n```ts\nexport type Provider =\n  ClassProvider |\n  TypeProvider |\n  ValueProvider |\n  FactoryProvider;\n```\n\n#### ClassProvider\n\n定义一个 Token 使用某个特定的构造函数的时候会用到的 Provider。\n\n```ts\nexport interface ClassProvider {\n  token: Token;\n  useClass: ConstructorOf<any>;\n}\n```\n\n在依赖反转之后，构造函数都依赖抽象而不依赖实例的时候会非常有效。比如下面的例子：\n\n```ts\ninterface Drivable {\n  drive(): void;\n}\n\n@Injectable()\nclass Student {\n  @Autowired('Drivable')\n  mBike: Drivable;\n\n  goToSchool() {\n    console.log('go to school');\n    mBike.drive();\n  }\n}\n```\n\n学生对象依赖的是一个可驾驶的交通工具，可以在创建对象的时候提供一个自行车，也可以在创建的时候提供一个汽车：\n\n```ts\n@Injectable()\nclass Car implements Drivable {\n  drive() {\n    console.log('by car')\n  }\n}\n\ninjector.addProviders(Student)\ninjector.addProviders({\n  token: 'Drivable',\n  useClass: Car,\n})\n\nconst student = injector.get(Student);\nstudent.goToSchool(); // print 'go to school by car'\n```\n\n#### TypeProvider\n\ntoken 和 useClass 都是一样的 ClassProvider，一般不会直接用到，使用 Autowired 如果是一个 Function，就会转换成这个类型。\n\n#### ValueProvider\n\n和 ClassProvider 一样作用，但是直接提供一个对象实例的 Provider。\n\n```ts\nexport interface ValueProvider {\n  token: Token;\n  useValue: any;\n}\n```\n\n#### FactoryProvider\n\n和 ClassProvider 一样作用，但是提供一个函数进行对象实例创建的 Provider。\n\n```ts\nexport interface FactoryFunction<T = any> {\n  (injector: Injector): T;\n}\nexport interface FactoryProvider {\n  token: Token;\n  useFactory: FactoryFunction<T>;\n}\n```\n\n同时也提供了一些工厂模式的帮助函数：\n\n1. `asSingleton`\n\n可以实现工厂单例：\n\n```ts\nconst provider = {\n  token,\n  useFactory: asSingleton(() => new A()),\n};\n```\n\n## Install\n\n```sh\nnpm install @opensumi/di --save\nyarn add @opensumi/di\n```\n\n## Usage\n\n### 对 Constructor 进行构造注入\n\n```ts\n@Injectable()\nclass A {\n  constructor() {\n    console.log('Create A');\n  }\n}\n\n@Injectable()\nclass B {\n  constructor(public a: A){}\n}\n\nconst injector = new Injector();\ninjector.addProviders(A, B);\n\nconst b = injector.get(B); // print 'Create A'\nconsole.log(b.a instanceof A) // print 'true'\n```\n\n### 使用 Autowired 进行动态注入\n\n```ts\n@Injectable()\nclass A {\n  constructor() {\n    console.log('Create A');\n  }\n}\n\n@Injectable()\nclass B {\n  @Autowired()\n  a: A;\n}\n\nconst injector = new Injector();\ninjector.addProviders(A, B);\n\nconst b = injector.get(B);\nconsole.log(b.a instanceof A); // print 'Create A'; print 'true'\n```\n\n### 单例与多例的用法\n\n```ts\n@Injectable()\nclass Single {\n  constructor() {}\n}\n\n@Injectable({ multiple: true })\nclass Multiple {\n  constructor() {}\n}\n\nconst injector = new Injector();\ninjector.addProviders(Single, Multiple);\n\nconst single1 = injector.get(Single);\nconst single2 = injector.get(Single);\nconsole.log(single1 === single2); // print 'true'\n\nconst multiple1 = injector.get(Multiple);\nconst multiple2 = injector.get(Multiple);\nconsole.log(multiple1 === multiple2); // print 'false'\n```\n\n### 类型依赖抽象而不是依赖实现的用法\n\n```ts\nconst LOGGER_TOKEN = Symbol('LOGGER_TOKEN');\n\ninterface Logger {\n  log(msg: string): void;\n}\n\n@Injectable()\nclass App {\n  @Autowired(LOGGER_TOKEN)\n  logger: Logger;\n}\n\n@Injectable()\nclass LoggerImpl implements Logger {\n  log(msg: string) {\n    console.log(msg);\n  }\n}\n\nconst injector = new Injector();\ninjector.addProviders(App);\ninjector.addProviders({\n  token: LOGGER_TOKEN,\n  useClass: LoggerImpl,\n});\n\nconst app = injector.get(App);\nconsole.log(app.logger instanceof LoggerImpl); // print 'true'\n```\n\n### 使用抽象函数作为 Token 进行依赖注入\n\n```ts\nabstract class Logger {\n  abstract log(msg: string): void;\n}\n\n@Injectable()\nclass LoggerImpl implements Logger {\n  log(msg: string) {\n    console.log(msg);\n  }\n}\n\n@Injectable()\nclass App {\n  @Autowired()\n  logger: Logger;\n}\n\nconst injector = new Injector();\ninjector.addProviders(App);\ninjector.addProviders({\n  token: Logger,\n  useClass: LoggerImpl,\n});\n\nconst app = injector.get(App);\nconsole.log(app.logger instanceof LoggerImpl); // print 'true'\n```\n\n## API\n\n### @Injectable\n\n```ts\ninterface InstanceOpts {\n  multiple?: boolean;\n}\nfunction Injectable(opts?: InstanceOpts): ClassDecorator;\n\n@Injectable({ multiple: true })\nclass A {}\n\nconst injector = new Injector([A]);\n\nconst a = injector.get(A);\nconsole.log(injector.hasInstance(a)) // print 'false'\n```\n\n所有需要被 Injector 创建的构造函数都应该使用这个装饰器修饰才可以正常使用，否则会报错\n\n- multiple: 是否启用多例模式，一旦启用了多例模式之后，Injector 将不会持有实例对象的引用。\n\n### @Autowired\n\n```ts\nfunction Autowired(token?: Token): PropertyDecorator;\n\n@Injectable()\nclass A {}\n\n@Injectable()\nclass B {\n  @Autowired()\n  a: A;\n}\n```\n\n修饰一个属性会被注册器动态创建依赖实例，而这个依赖实例只有在被使用的时候才会被创建出来。比如上面的例子中，只有访问到 `b.a` 的时候，才会创建 A 的实例。\n\n> 需要注意的是，因为 Autowired 依赖着 Injector 的实例，所以只有从 Injector 创建出来的对象可以使用这个装饰器\n\n### @Inject\n\n```ts\nfunction Inject(token: string | symbol): ParameterDecorator;\n\ninterface IA {\n  log(): void;\n}\n\n@Injectable()\nclass B {\n  constructor(@Inject('IA') a: IA) {}\n}\n```\n\n在构造函数进行依赖注入的时候，需要特别指定依赖 Token 的时候的装饰器。当一个构造函数依赖某个抽象，并且这个抽象是在构造函数中传递进来的时候，会需要使用这个装饰器。\n\n### Injector.get\n\n多态实现：\n\n```ts\ninterface Injector<T extends Token> {\n  get(token: ConstructorOf<any>, args?: ConstructorParameters<T>, opts?: InstanceOpts): TokenResult<T>;\n  get(token: T, opts?: InstanceOpts): TokenResult<T>;\n}\n\n```\n\n从 Injector 获取一个对象实例的方法，如果传递的是一个构造函数，第二个参数可以传递构造函数 Arguments 数据，此时将会直接将构造函数创建实例返回，并附加依赖注入的功能，此时的构造函数不需要被 Injectable 装饰也能正常创建对象。例如下面这样：\n\n```ts\n@Injectable()\nclass A {}\n\nclass B {\n  @Autowired()\n  a: A;\n}\n\nconst injector = new Injector([A])\nconst b = injector.get(B, []);\nconsole.log(b.a instanceof A); // print 'true'\n```\n\n### Injector.hasInstance\n\nInjector 中是否具备某个对象的单例引用\n\n## Example Readmes\n\n更多的用例可以 [点击查看](test/use-case.test.ts).\n\n## Related Efforts\n\n- [Angular](https://angular.io/guide/dependency-injection) - Angular 的 DI 工具使用文档\n- [injection-js](https://github.com/mgechev/injection-js) - 把 Angular 的 DI 抽取出来的单独仓库。\n- [InversifyJS](https://github.com/inversify/InversifyJS) - 目前社区中比较受欢迎的 DI 库，但是感觉用法比较麻烦。\n- [power-di](https://github.com/zhang740/power-di) - 支付宝小程序目前使用的 DI 工具。\n\n### Thank You\n\n- [suyu34](https://github.com/suyu34)\n","engines":{"node":">=8.0.0"},"gitHead":"a72695b055ad5369adde5eaaaf45186c37663c30","scripts":{"ci":"npm run lint && npm run test","tsc":"rm -rf dist && tsc -p tsconfig.prod.json","lint":"eslint . --ext .js,.jsx,.ts,.tsx","test":"jest --coverage test/**","commit":"git-cz","prepare":"husky install","release":"standard-version","prerelease":"npm run lint && npm run test && npm run tsc ","test:watch":"yarn test --watch","release:beta":"npm run release -- --prerelease beta"},"_npmUser":{"name":"lengthmin","email":"lengthmin@gmail.com"},"commitlint":{"extends":["@commitlint/config-conventional"]},"repository":{"url":"git+ssh://git@github.com/opensumi/di.git","type":"git"},"_npmVersion":"6.14.17","description":"A dependency injection tool for Javascript.","directories":{},"lint-staged":{"*.ts":["eslint --fix","prettier --write"]},"_nodeVersion":"14.19.3","dependencies":{"reflect-metadata":"^0.1.13"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jest":"^28.0.3","husky":"^7.0.4","eslint":"^8.14.0","ts-jest":"^28.0.1","prettier":"2.6.2","commitizen":"^4.2.4","commitlint":"^16.2.4","typescript":"^4.6.4","@types/jest":"^27.5.0","@types/node":"^17.0.31","lint-staged":"^12.4.1","@commitlint/cli":"^16.2.4","standard-version":"^9.3.2","eslint-config-prettier":"^8.5.0","@typescript-eslint/parser":"^5.22.0","cz-conventional-changelog":"^3.3.0","@commitlint/config-conventional":"^16.2.4","@typescript-eslint/eslint-plugin":"^5.22.0"},"_npmOperationalInternal":{"tmp":"tmp/di_1.4.0-beta.0_1653399402055_0.07197770705212148","host":"s3://npm-registry-packages"}},"1.4.0-beta.1":{"name":"@opensumi/di","version":"1.4.0-beta.1","keywords":["di","injector"],"license":"MIT","_id":"@opensumi/di@1.4.0-beta.1","maintainers":[{"name":"ricbet","email":"18676769065@163.com"},{"name":"hacke2","email":"hacke2cn@gmail.com"},{"name":"jinboker","email":"jinboker@foxmail.com"},{"name":"ensorrow","email":"1121264060@qq.com"},{"name":"sakuraash","email":"binshao54@gmail.com"},{"name":"erha19","email":"faterrole@gmail.com"},{"name":"lengthmin","email":"lengthmin@gmail.com"}],"homepage":"https://github.com/opensumi/di#readme","bugs":{"url":"https://github.com/opensumi/di/issues"},"dist":{"shasum":"36520a5888ef96cbc463460f271a9360376d693c","tarball":"https://registry.npmjs.org/@opensumi/di/-/di-1.4.0-beta.1.tgz","fileCount":34,"integrity":"sha512-ZfShOIaKlvDhvwasZU4aVZlE1LFBMQv9REF50dqu3lF642kVPlobxXRn6V1eNXyIy45WrayaM9kTxrp3jpwunA==","signatures":[{"sig":"MEUCIQC8xAwtmaA7wDwJD+SYFPCP3KJBysnbbLzyBJtmMtpjEQIgP9mkm0Unoj2Z0zLVn2PIe2pfi+428uutPEzjD2HHvpo=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":111859,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJilNHIACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmr+IQ//ZoQBtPCpKKiV1cYmRePjYd+oS/l4IyAZH2egnqWKijY6dwxu\r\nGk7F1GQyouZj6yr0spU74PzYV3HAePnAhkXjDVZbj1cESkuutrw+hVPIQoJn\r\neqqsboBOTHjRQu/zsKR0K9LBeJiKb5NipVTtx8w1eTRGYQpMvGSTW4aYF/eK\r\nbZHBgD6CdtC2jKJqIIW0PV7xnzFo25ELvHEaLwfsaFqZ5QfDkhxdmwV6lZVm\r\nANh97pbM3uIUVHwIKSzTw+9rWeMaqThi8D70+kWjS/nzbUfncfCnyoeuAZye\r\nJ0bf6DN65ZrOFX/fo3r4IYOpQ0q4T2PACY4WWoo70u2B1RMBvOJabehjeNCi\r\naysF0EqjQi9QEFOtmAC/erMMipjb7tthQWOjcItmifZlZDj675vGlua0rlV0\r\nt4OZH20kUV1bURwSSGlgGLpqev5wsXYgVfbD48pRSyWh7gNqmwRUTRHeMvG7\r\nX64m4+4n2gri7BYNYgzhzpX225OXvPWtrFYQ65OQ4sLImrwBtMuuC1ljjdlo\r\nsN0UP+hMjudagHVzOrg2Dii+PxkuyNQyWAASN5+rWjz1M2MOMSEziBzFnON0\r\nYwErX0W6iCbq9blnj7W5+xiwSdyDi9hDhLH7A37Dd/6JZDt+eCus4dsdkAu3\r\nUdM3eUGVoGP5z1UECRop511kA6W2WGXnwSU=\r\n=zaTR\r\n-----END PGP SIGNATURE-----\r\n"},"jest":{"preset":"ts-jest","testEnvironment":"node","coverageThreshold":{"global":{"lines":10,"branches":10,"functions":10,"statements":10}},"coveragePathIgnorePatterns":["/node_modules/","/test/"]},"main":"dist/index.js","readme":"# @opensumi/di\n\n[![CI](https://github.com/opensumi/di/actions/workflows/ci.yml/badge.svg)](https://github.com/opensumi/di/actions/workflows/ci.yml)\n[![NPM Version][npm-image]][npm-url]\n[![NPM downloads][download-image]][download-url]\n[![Test Coverage][test-image]][test-url]\n[![License][license-image]][license-url]\n\n[npm-image]: https://img.shields.io/npm/v/@opensumi/di.svg\n[npm-url]: https://www.npmjs.com/package/@opensumi/di\n[download-image]: https://img.shields.io/npm/dm/@opensumi/di.svg\n[download-url]: https://npmjs.org/package/@opensumi/di\n[license-image]: https://img.shields.io/npm/l/@opensumi/di.svg\n[license-url]: https://github.com/opensumi/di/blob/main/LICENSE\n[test-image]: https://codecov.io/gh/opensumi/di/branch/main/graph/badge.svg?token=07JAPLU957\n[test-url]: https://codecov.io/gh/opensumi/di\n\n> 基于 [Angular DI](https://angular.io/guide/dependency-injection) 的设计实现的依赖注入工具。\n\n如果你想在项目中使用工厂模式或者依赖反转，那么必不可少的需要一个依赖注入的工具。这个工具将会帮助你很好的帮助你实现依赖反转，而不在关系那些对象实例化的细节。同时，因为对象的实例化在注册器中进行创建，所以单例模式也很容易在这里实现。\n\n## Table of Contents\n\n- [Background](#background)\n- [Install](#install)\n- [Usage](#usage)\n- [API](#API)\n- [Example Readmes](#example-readmes)\n- [Related Efforts](#related-efforts)\n\n## Background\n\n出于对于 DI 的需要，并且调研市场上的 DI 工具，都有一些不太满意的地方，所以写了一个工具来实现 Angular 定义的 DI 模式。\n\n- Inversify.Js 用法太过于死板，显示的 Token 模式，导致要写很多代码，相较于 API 还是 Angular 的 Token 和 Provider 的设计更容易理解。\n- injection-js 从 Angular 抽离出来的 DI 工具，因为具有 Angular 的 Module 设计，一般的 DI 是不需要要的。\n\n### Token\n\n查找实例的唯一标记，类型描述如下：\n\n```ts\nexport type Token = string | symbol | Function;\n```\n\n### Provider\n\n为 Token 提供实例的定义，一共有四种类型的 Provider 定义：\n\n```ts\nexport type Provider =\n  ClassProvider |\n  TypeProvider |\n  ValueProvider |\n  FactoryProvider;\n```\n\n#### ClassProvider\n\n定义一个 Token 使用某个特定的构造函数的时候会用到的 Provider。\n\n```ts\nexport interface ClassProvider {\n  token: Token;\n  useClass: ConstructorOf<any>;\n}\n```\n\n在依赖反转之后，构造函数都依赖抽象而不依赖实例的时候会非常有效。比如下面的例子：\n\n```ts\ninterface Drivable {\n  drive(): void;\n}\n\n@Injectable()\nclass Student {\n  @Autowired('Drivable')\n  mBike: Drivable;\n\n  goToSchool() {\n    console.log('go to school');\n    mBike.drive();\n  }\n}\n```\n\n学生对象依赖的是一个可驾驶的交通工具，可以在创建对象的时候提供一个自行车，也可以在创建的时候提供一个汽车：\n\n```ts\n@Injectable()\nclass Car implements Drivable {\n  drive() {\n    console.log('by car')\n  }\n}\n\ninjector.addProviders(Student)\ninjector.addProviders({\n  token: 'Drivable',\n  useClass: Car,\n})\n\nconst student = injector.get(Student);\nstudent.goToSchool(); // print 'go to school by car'\n```\n\n#### TypeProvider\n\ntoken 和 useClass 都是一样的 ClassProvider，一般不会直接用到，使用 Autowired 如果是一个 Function，就会转换成这个类型。\n\n#### ValueProvider\n\n和 ClassProvider 一样作用，但是直接提供一个对象实例的 Provider。\n\n```ts\nexport interface ValueProvider {\n  token: Token;\n  useValue: any;\n}\n```\n\n#### FactoryProvider\n\n和 ClassProvider 一样作用，但是提供一个函数进行对象实例创建的 Provider。\n\n```ts\nexport interface FactoryFunction<T = any> {\n  (injector: Injector): T;\n}\nexport interface FactoryProvider {\n  token: Token;\n  useFactory: FactoryFunction<T>;\n}\n```\n\n同时也提供了一些工厂模式的帮助函数：\n\n1. `asSingleton`\n\n可以实现工厂单例：\n\n```ts\nconst provider = {\n  token,\n  useFactory: asSingleton(() => new A()),\n};\n```\n\n## Install\n\n```sh\nnpm install @opensumi/di --save\nyarn add @opensumi/di\n```\n\n## Usage\n\n### 对 Constructor 进行构造注入\n\n```ts\n@Injectable()\nclass A {\n  constructor() {\n    console.log('Create A');\n  }\n}\n\n@Injectable()\nclass B {\n  constructor(public a: A){}\n}\n\nconst injector = new Injector();\ninjector.addProviders(A, B);\n\nconst b = injector.get(B); // print 'Create A'\nconsole.log(b.a instanceof A) // print 'true'\n```\n\n### 使用 Autowired 进行动态注入\n\n```ts\n@Injectable()\nclass A {\n  constructor() {\n    console.log('Create A');\n  }\n}\n\n@Injectable()\nclass B {\n  @Autowired()\n  a: A;\n}\n\nconst injector = new Injector();\ninjector.addProviders(A, B);\n\nconst b = injector.get(B);\nconsole.log(b.a instanceof A); // print 'Create A'; print 'true'\n```\n\n### 单例与多例的用法\n\n```ts\n@Injectable()\nclass Single {\n  constructor() {}\n}\n\n@Injectable({ multiple: true })\nclass Multiple {\n  constructor() {}\n}\n\nconst injector = new Injector();\ninjector.addProviders(Single, Multiple);\n\nconst single1 = injector.get(Single);\nconst single2 = injector.get(Single);\nconsole.log(single1 === single2); // print 'true'\n\nconst multiple1 = injector.get(Multiple);\nconst multiple2 = injector.get(Multiple);\nconsole.log(multiple1 === multiple2); // print 'false'\n```\n\n### 类型依赖抽象而不是依赖实现的用法\n\n```ts\nconst LOGGER_TOKEN = Symbol('LOGGER_TOKEN');\n\ninterface Logger {\n  log(msg: string): void;\n}\n\n@Injectable()\nclass App {\n  @Autowired(LOGGER_TOKEN)\n  logger: Logger;\n}\n\n@Injectable()\nclass LoggerImpl implements Logger {\n  log(msg: string) {\n    console.log(msg);\n  }\n}\n\nconst injector = new Injector();\ninjector.addProviders(App);\ninjector.addProviders({\n  token: LOGGER_TOKEN,\n  useClass: LoggerImpl,\n});\n\nconst app = injector.get(App);\nconsole.log(app.logger instanceof LoggerImpl); // print 'true'\n```\n\n### 使用抽象函数作为 Token 进行依赖注入\n\n```ts\nabstract class Logger {\n  abstract log(msg: string): void;\n}\n\n@Injectable()\nclass LoggerImpl implements Logger {\n  log(msg: string) {\n    console.log(msg);\n  }\n}\n\n@Injectable()\nclass App {\n  @Autowired()\n  logger: Logger;\n}\n\nconst injector = new Injector();\ninjector.addProviders(App);\ninjector.addProviders({\n  token: Logger,\n  useClass: LoggerImpl,\n});\n\nconst app = injector.get(App);\nconsole.log(app.logger instanceof LoggerImpl); // print 'true'\n```\n\n## API\n\n### @Injectable\n\n```ts\ninterface InstanceOpts {\n  multiple?: boolean;\n}\nfunction Injectable(opts?: InstanceOpts): ClassDecorator;\n\n@Injectable({ multiple: true })\nclass A {}\n\nconst injector = new Injector([A]);\n\nconst a = injector.get(A);\nconsole.log(injector.hasInstance(a)) // print 'false'\n```\n\n所有需要被 Injector 创建的构造函数都应该使用这个装饰器修饰才可以正常使用，否则会报错\n\n- multiple: 是否启用多例模式，一旦启用了多例模式之后，Injector 将不会持有实例对象的引用。\n\n### @Autowired\n\n```ts\nfunction Autowired(token?: Token): PropertyDecorator;\n\n@Injectable()\nclass A {}\n\n@Injectable()\nclass B {\n  @Autowired()\n  a: A;\n}\n```\n\n修饰一个属性会被注册器动态创建依赖实例，而这个依赖实例只有在被使用的时候才会被创建出来。比如上面的例子中，只有访问到 `b.a` 的时候，才会创建 A 的实例。\n\n> 需要注意的是，因为 Autowired 依赖着 Injector 的实例，所以只有从 Injector 创建出来的对象可以使用这个装饰器\n\n### @Inject\n\n```ts\nfunction Inject(token: string | symbol): ParameterDecorator;\n\ninterface IA {\n  log(): void;\n}\n\n@Injectable()\nclass B {\n  constructor(@Inject('IA') a: IA) {}\n}\n```\n\n在构造函数进行依赖注入的时候，需要特别指定依赖 Token 的时候的装饰器。当一个构造函数依赖某个抽象，并且这个抽象是在构造函数中传递进来的时候，会需要使用这个装饰器。\n\n### Injector.get\n\n多态实现：\n\n```ts\ninterface Injector<T extends Token> {\n  get(token: ConstructorOf<any>, args?: ConstructorParameters<T>, opts?: InstanceOpts): TokenResult<T>;\n  get(token: T, opts?: InstanceOpts): TokenResult<T>;\n}\n\n```\n\n从 Injector 获取一个对象实例的方法，如果传递的是一个构造函数，第二个参数可以传递构造函数 Arguments 数据，此时将会直接将构造函数创建实例返回，并附加依赖注入的功能，此时的构造函数不需要被 Injectable 装饰也能正常创建对象。例如下面这样：\n\n```ts\n@Injectable()\nclass A {}\n\nclass B {\n  @Autowired()\n  a: A;\n}\n\nconst injector = new Injector([A])\nconst b = injector.get(B, []);\nconsole.log(b.a instanceof A); // print 'true'\n```\n\n### Injector.hasInstance\n\nInjector 中是否具备某个对象的单例引用\n\n## Example Readmes\n\n更多的用例可以 [点击查看](test/use-case.test.ts).\n\n## Related Efforts\n\n- [Angular](https://angular.io/guide/dependency-injection) - Angular 的 DI 工具使用文档\n- [injection-js](https://github.com/mgechev/injection-js) - 把 Angular 的 DI 抽取出来的单独仓库。\n- [InversifyJS](https://github.com/inversify/InversifyJS) - 目前社区中比较受欢迎的 DI 库，但是感觉用法比较麻烦。\n- [power-di](https://github.com/zhang740/power-di) - 支付宝小程序目前使用的 DI 工具。\n\n### Thank You\n\n- [suyu34](https://github.com/suyu34)\n","engines":{"node":">=8.0.0"},"gitHead":"9d8250db972308bd44e63158bf4e3246289736a9","scripts":{"ci":"npm run lint && npm run test","tsc":"rm -rf dist && tsc -p tsconfig.prod.json","lint":"eslint . --ext .js,.jsx,.ts,.tsx","test":"jest --coverage test/**","prepare":"husky install","release":"standard-version","prerelease":"npm run lint && npm run test && npm run tsc ","test:watch":"yarn test --watch","release:beta":"npm run release -- --prerelease beta"},"_npmUser":{"name":"lengthmin","email":"lengthmin@gmail.com"},"commitlint":{"extends":["@commitlint/config-conventional"]},"repository":{"url":"git+ssh://git@github.com/opensumi/di.git","type":"git"},"_npmVersion":"6.14.17","description":"A dependency injection tool for Javascript.","directories":{},"lint-staged":{"*.ts":["eslint --fix","prettier --write"]},"_nodeVersion":"14.19.3","dependencies":{"reflect-metadata":"^0.1.13"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jest":"^28.1.0","husky":"^8.0.1","eslint":"^8.16.0","ts-jest":"^28.0.3","prettier":"2.6.2","commitlint":"^17.0.1","typescript":"^4.7.2","@types/jest":"^27.5.1","@types/node":"^17.0.36","lint-staged":"^12.4.3","@commitlint/cli":"^17.0.1","standard-version":"^9.5.0","eslint-config-prettier":"^8.5.0","@typescript-eslint/parser":"^5.26.0","@commitlint/config-conventional":"^17.0.0","@typescript-eslint/eslint-plugin":"^5.26.0"},"_npmOperationalInternal":{"tmp":"tmp/di_1.4.0-beta.1_1653920200316_0.48409563962538593","host":"s3://npm-registry-packages"}},"1.4.0-beta.2":{"name":"@opensumi/di","version":"1.4.0-beta.2","keywords":["di","injector"],"license":"MIT","_id":"@opensumi/di@1.4.0-beta.2","maintainers":[{"name":"ricbet","email":"18676769065@163.com"},{"name":"hacke2","email":"hacke2cn@gmail.com"},{"name":"jinboker","email":"jinboker@foxmail.com"},{"name":"ensorrow","email":"1121264060@qq.com"},{"name":"sakuraash","email":"binshao54@gmail.com"},{"name":"erha19","email":"faterrole@gmail.com"},{"name":"lengthmin","email":"lengthmin@gmail.com"}],"homepage":"https://github.com/opensumi/di#readme","bugs":{"url":"https://github.com/opensumi/di/issues"},"dist":{"shasum":"163f2a81bbb2b01cdf40882ae42cb499b522d56b","tarball":"https://registry.npmjs.org/@opensumi/di/-/di-1.4.0-beta.2.tgz","fileCount":36,"integrity":"sha512-0tunw8ur6Oyqtu/IdQmslRxUkmf8y9voKWQUPc3S50j83YksPiTff2UYtOyBBOtN/DS5xpDo3PeU7PeF7w9wgQ==","signatures":[{"sig":"MEQCIHMDiAmwwh5Q4GBDDgg5v5dkPewdcrrfd9VaZPqOzDDPAiBttsbrbt0p5mC7/VhN45EbZdSG6+UzNtoj69qC5Wbs0w==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":112148,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJilN6zACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmpr5Q/7BJwByQrW8MsOXX/u6bNJ0bX3cE0h2G3m9uD2AhiBduA7BTEY\r\nmoB+8A7Nb8zKGK40FxMWOjidhwwhEeOO6zv2/nWH3jL8MMartf7JCmGwfPZ0\r\npXJ92WeoVwAmt4mgTXKG3tVYY79lBYZWxJmRWmjW/VytVZzUoN6oc/DEy146\r\npCgM3jNXVwORiBx0mGRaH9DyGbAe/Sk1PBQWKYVSDL2K7dCq/6PtJXg8zOLH\r\n3SUMyHGDroN5mHzloybyDY/fiXxPYmN0ZwvaKELmWgVjeMcluAfRG7KzwR1X\r\n9ZttJqanQx7OjzZkAr5/p1+9sKv1vFevTjvapjSA0P1hL7cTtlF0dOIAQRLw\r\nlhotat+wMi8M+umM5ktwkFqfKyLby8Yml6nqMtZl3hXiqgX13e5nz70yKOwr\r\nK/K8a6DeXaVE21AEayFmdoBanOp7Bsazwq4PtbrleD/aJiLsVeuJmJ9z3cVT\r\ni1wReCZtlPaA6w3nhSXhsZrdP9spuTYj2TUZ4361YQEOYWpjuJBC6irYa9GH\r\nSOkaQzuhyOOyg/iPCbsfD6dvcm1RvbpGENG9fNA+aXJXcGDrmjQJ7hHVgv/W\r\n/vFYG1nXVnYlNYGJCAZGRdEmT4hjFepxA0SsjAf7CtnGODvVicsS+e6TmQyF\r\n3XhaJoQlM5K9aqm9XuiytbYSPBtmlm/uLT0=\r\n=MEiT\r\n-----END PGP SIGNATURE-----\r\n"},"jest":{"preset":"ts-jest","testEnvironment":"node","coverageThreshold":{"global":{"lines":10,"branches":10,"functions":10,"statements":10}},"coveragePathIgnorePatterns":["/node_modules/","/test/"]},"main":"dist/index.js","readme":"# @opensumi/di\n\n[![CI](https://github.com/opensumi/di/actions/workflows/ci.yml/badge.svg)](https://github.com/opensumi/di/actions/workflows/ci.yml)\n[![NPM Version][npm-image]][npm-url]\n[![NPM downloads][download-image]][download-url]\n[![Test Coverage][test-image]][test-url]\n[![License][license-image]][license-url]\n\n[npm-image]: https://img.shields.io/npm/v/@opensumi/di.svg\n[npm-url]: https://www.npmjs.com/package/@opensumi/di\n[download-image]: https://img.shields.io/npm/dm/@opensumi/di.svg\n[download-url]: https://npmjs.org/package/@opensumi/di\n[license-image]: https://img.shields.io/npm/l/@opensumi/di.svg\n[license-url]: https://github.com/opensumi/di/blob/main/LICENSE\n[test-image]: https://codecov.io/gh/opensumi/di/branch/main/graph/badge.svg?token=07JAPLU957\n[test-url]: https://codecov.io/gh/opensumi/di\n\n> 基于 [Angular DI](https://angular.io/guide/dependency-injection) 的设计实现的依赖注入工具。\n\n如果你想在项目中使用工厂模式或者依赖反转，那么必不可少的需要一个依赖注入的工具。这个工具将会帮助你很好的帮助你实现依赖反转，而不在关系那些对象实例化的细节。同时，因为对象的实例化在注册器中进行创建，所以单例模式也很容易在这里实现。\n\n## Table of Contents\n\n- [Background](#background)\n- [Install](#install)\n- [Usage](#usage)\n- [API](#API)\n- [Example Readmes](#example-readmes)\n- [Related Efforts](#related-efforts)\n\n## Background\n\n出于对于 DI 的需要，并且调研市场上的 DI 工具，都有一些不太满意的地方，所以写了一个工具来实现 Angular 定义的 DI 模式。\n\n- Inversify.Js 用法太过于死板，显示的 Token 模式，导致要写很多代码，相较于 API 还是 Angular 的 Token 和 Provider 的设计更容易理解。\n- injection-js 从 Angular 抽离出来的 DI 工具，因为具有 Angular 的 Module 设计，一般的 DI 是不需要要的。\n\n### Token\n\n查找实例的唯一标记，类型描述如下：\n\n```ts\nexport type Token = string | symbol | Function;\n```\n\n### Provider\n\n为 Token 提供实例的定义，一共有四种类型的 Provider 定义：\n\n```ts\nexport type Provider =\n  ClassProvider |\n  TypeProvider |\n  ValueProvider |\n  FactoryProvider;\n```\n\n#### ClassProvider\n\n定义一个 Token 使用某个特定的构造函数的时候会用到的 Provider。\n\n```ts\nexport interface ClassProvider {\n  token: Token;\n  useClass: ConstructorOf<any>;\n}\n```\n\n在依赖反转之后，构造函数都依赖抽象而不依赖实例的时候会非常有效。比如下面的例子：\n\n```ts\ninterface Drivable {\n  drive(): void;\n}\n\n@Injectable()\nclass Student {\n  @Autowired('Drivable')\n  mBike: Drivable;\n\n  goToSchool() {\n    console.log('go to school');\n    mBike.drive();\n  }\n}\n```\n\n学生对象依赖的是一个可驾驶的交通工具，可以在创建对象的时候提供一个自行车，也可以在创建的时候提供一个汽车：\n\n```ts\n@Injectable()\nclass Car implements Drivable {\n  drive() {\n    console.log('by car')\n  }\n}\n\ninjector.addProviders(Student)\ninjector.addProviders({\n  token: 'Drivable',\n  useClass: Car,\n})\n\nconst student = injector.get(Student);\nstudent.goToSchool(); // print 'go to school by car'\n```\n\n#### TypeProvider\n\ntoken 和 useClass 都是一样的 ClassProvider，一般不会直接用到，使用 Autowired 如果是一个 Function，就会转换成这个类型。\n\n#### ValueProvider\n\n和 ClassProvider 一样作用，但是直接提供一个对象实例的 Provider。\n\n```ts\nexport interface ValueProvider {\n  token: Token;\n  useValue: any;\n}\n```\n\n#### FactoryProvider\n\n和 ClassProvider 一样作用，但是提供一个函数进行对象实例创建的 Provider。\n\n```ts\nexport interface FactoryFunction<T = any> {\n  (injector: Injector): T;\n}\nexport interface FactoryProvider {\n  token: Token;\n  useFactory: FactoryFunction<T>;\n}\n```\n\n同时也提供了一些工厂模式的帮助函数：\n\n1. `asSingleton`\n\n可以实现工厂单例：\n\n```ts\nconst provider = {\n  token,\n  useFactory: asSingleton(() => new A()),\n};\n```\n\n## Install\n\n```sh\nnpm install @opensumi/di --save\nyarn add @opensumi/di\n```\n\n## Usage\n\n### 对 Constructor 进行构造注入\n\n```ts\n@Injectable()\nclass A {\n  constructor() {\n    console.log('Create A');\n  }\n}\n\n@Injectable()\nclass B {\n  constructor(public a: A){}\n}\n\nconst injector = new Injector();\ninjector.addProviders(A, B);\n\nconst b = injector.get(B); // print 'Create A'\nconsole.log(b.a instanceof A) // print 'true'\n```\n\n### 使用 Autowired 进行动态注入\n\n```ts\n@Injectable()\nclass A {\n  constructor() {\n    console.log('Create A');\n  }\n}\n\n@Injectable()\nclass B {\n  @Autowired()\n  a: A;\n}\n\nconst injector = new Injector();\ninjector.addProviders(A, B);\n\nconst b = injector.get(B);\nconsole.log(b.a instanceof A); // print 'Create A'; print 'true'\n```\n\n### 单例与多例的用法\n\n```ts\n@Injectable()\nclass Single {\n  constructor() {}\n}\n\n@Injectable({ multiple: true })\nclass Multiple {\n  constructor() {}\n}\n\nconst injector = new Injector();\ninjector.addProviders(Single, Multiple);\n\nconst single1 = injector.get(Single);\nconst single2 = injector.get(Single);\nconsole.log(single1 === single2); // print 'true'\n\nconst multiple1 = injector.get(Multiple);\nconst multiple2 = injector.get(Multiple);\nconsole.log(multiple1 === multiple2); // print 'false'\n```\n\n### 类型依赖抽象而不是依赖实现的用法\n\n```ts\nconst LOGGER_TOKEN = Symbol('LOGGER_TOKEN');\n\ninterface Logger {\n  log(msg: string): void;\n}\n\n@Injectable()\nclass App {\n  @Autowired(LOGGER_TOKEN)\n  logger: Logger;\n}\n\n@Injectable()\nclass LoggerImpl implements Logger {\n  log(msg: string) {\n    console.log(msg);\n  }\n}\n\nconst injector = new Injector();\ninjector.addProviders(App);\ninjector.addProviders({\n  token: LOGGER_TOKEN,\n  useClass: LoggerImpl,\n});\n\nconst app = injector.get(App);\nconsole.log(app.logger instanceof LoggerImpl); // print 'true'\n```\n\n### 使用抽象函数作为 Token 进行依赖注入\n\n```ts\nabstract class Logger {\n  abstract log(msg: string): void;\n}\n\n@Injectable()\nclass LoggerImpl implements Logger {\n  log(msg: string) {\n    console.log(msg);\n  }\n}\n\n@Injectable()\nclass App {\n  @Autowired()\n  logger: Logger;\n}\n\nconst injector = new Injector();\ninjector.addProviders(App);\ninjector.addProviders({\n  token: Logger,\n  useClass: LoggerImpl,\n});\n\nconst app = injector.get(App);\nconsole.log(app.logger instanceof LoggerImpl); // print 'true'\n```\n\n## API\n\n### @Injectable\n\n```ts\ninterface InstanceOpts {\n  multiple?: boolean;\n}\nfunction Injectable(opts?: InstanceOpts): ClassDecorator;\n\n@Injectable({ multiple: true })\nclass A {}\n\nconst injector = new Injector([A]);\n\nconst a = injector.get(A);\nconsole.log(injector.hasInstance(a)) // print 'false'\n```\n\n所有需要被 Injector 创建的构造函数都应该使用这个装饰器修饰才可以正常使用，否则会报错\n\n- multiple: 是否启用多例模式，一旦启用了多例模式之后，Injector 将不会持有实例对象的引用。\n\n### @Autowired\n\n```ts\nfunction Autowired(token?: Token): PropertyDecorator;\n\n@Injectable()\nclass A {}\n\n@Injectable()\nclass B {\n  @Autowired()\n  a: A;\n}\n```\n\n修饰一个属性会被注册器动态创建依赖实例，而这个依赖实例只有在被使用的时候才会被创建出来。比如上面的例子中，只有访问到 `b.a` 的时候，才会创建 A 的实例。\n\n> 需要注意的是，因为 Autowired 依赖着 Injector 的实例，所以只有从 Injector 创建出来的对象可以使用这个装饰器\n\n### @Inject\n\n```ts\nfunction Inject(token: string | symbol): ParameterDecorator;\n\ninterface IA {\n  log(): void;\n}\n\n@Injectable()\nclass B {\n  constructor(@Inject('IA') a: IA) {}\n}\n```\n\n在构造函数进行依赖注入的时候，需要特别指定依赖 Token 的时候的装饰器。当一个构造函数依赖某个抽象，并且这个抽象是在构造函数中传递进来的时候，会需要使用这个装饰器。\n\n### Injector.get\n\n多态实现：\n\n```ts\ninterface Injector<T extends Token> {\n  get(token: ConstructorOf<any>, args?: ConstructorParameters<T>, opts?: InstanceOpts): TokenResult<T>;\n  get(token: T, opts?: InstanceOpts): TokenResult<T>;\n}\n\n```\n\n从 Injector 获取一个对象实例的方法，如果传递的是一个构造函数，第二个参数可以传递构造函数 Arguments 数据，此时将会直接将构造函数创建实例返回，并附加依赖注入的功能，此时的构造函数不需要被 Injectable 装饰也能正常创建对象。例如下面这样：\n\n```ts\n@Injectable()\nclass A {}\n\nclass B {\n  @Autowired()\n  a: A;\n}\n\nconst injector = new Injector([A])\nconst b = injector.get(B, []);\nconsole.log(b.a instanceof A); // print 'true'\n```\n\n### Injector.hasInstance\n\nInjector 中是否具备某个对象的单例引用\n\n## Example Readmes\n\n更多的用例可以 [点击查看](test/use-case.test.ts).\n\n## Related Efforts\n\n- [Angular](https://angular.io/guide/dependency-injection) - Angular 的 DI 工具使用文档\n- [injection-js](https://github.com/mgechev/injection-js) - 把 Angular 的 DI 抽取出来的单独仓库。\n- [InversifyJS](https://github.com/inversify/InversifyJS) - 目前社区中比较受欢迎的 DI 库，但是感觉用法比较麻烦。\n- [power-di](https://github.com/zhang740/power-di) - 支付宝小程序目前使用的 DI 工具。\n\n### Thank You\n\n- [suyu34](https://github.com/suyu34)\n","engines":{"node":">=8.0.0"},"gitHead":"58735b0a596dec387017f9d6f85ec57d84bc85fd","scripts":{"ci":"npm run lint && npm run test","tsc":"rm -rf dist && tsc -p tsconfig.prod.json","lint":"eslint . --ext .js,.jsx,.ts,.tsx","test":"jest --coverage test/**","prepare":"husky install","release":"standard-version","prerelease":"npm run lint && npm run test && npm run tsc ","test:watch":"yarn test --watch","release:beta":"npm run release -- --prerelease beta"},"_npmUser":{"name":"lengthmin","email":"lengthmin@gmail.com"},"commitlint":{"extends":["@commitlint/config-conventional"]},"repository":{"url":"git+ssh://git@github.com/opensumi/di.git","type":"git"},"_npmVersion":"6.14.17","description":"A dependency injection tool for Javascript.","directories":{},"lint-staged":{"*.ts":["eslint --fix","prettier --write"]},"_nodeVersion":"14.19.3","dependencies":{"reflect-metadata":"^0.1.13"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jest":"^28.1.0","husky":"^8.0.1","eslint":"^8.16.0","ts-jest":"^28.0.3","prettier":"2.6.2","commitlint":"^17.0.1","typescript":"^4.7.2","@types/jest":"^27.5.1","@types/node":"^17.0.36","lint-staged":"^12.4.3","@commitlint/cli":"^17.0.1","standard-version":"^9.5.0","eslint-config-prettier":"^8.5.0","@typescript-eslint/parser":"^5.26.0","@commitlint/config-conventional":"^17.0.0","@typescript-eslint/eslint-plugin":"^5.26.0"},"standard-version":{"bumpFiles":[{"updater":"./scripts/versionUpdater.js","filename":"./src/constants.ts"},{"type":"json","filename":"package.json"}]},"_npmOperationalInternal":{"tmp":"tmp/di_1.4.0-beta.2_1653923507219_0.30626284679235694","host":"s3://npm-registry-packages"}},"1.4.0":{"name":"@opensumi/di","version":"1.4.0","keywords":["di","injector"],"license":"MIT","_id":"@opensumi/di@1.4.0","maintainers":[{"name":"ricbet","email":"18676769065@163.com"},{"name":"hacke2","email":"hacke2cn@gmail.com"},{"name":"jinboker","email":"jinboker@foxmail.com"},{"name":"ensorrow","email":"1121264060@qq.com"},{"name":"sakuraash","email":"binshao54@gmail.com"},{"name":"erha19","email":"faterrole@gmail.com"},{"name":"lengthmin","email":"lengthmin@gmail.com"}],"homepage":"https://github.com/opensumi/di#readme","bugs":{"url":"https://github.com/opensumi/di/issues"},"dist":{"shasum":"6afea33f08d1551416c2ba3e3c376878e8ddfa31","tarball":"https://registry.npmjs.org/@opensumi/di/-/di-1.4.0.tgz","fileCount":36,"integrity":"sha512-lTNnv7RvXd/RkYKEmhorOUZk5pIfvPtJiOIEOWN4RNMDBAGTemObA7D8pkAuWyMCicyjXKxLfhf5yRVyjHudzw==","signatures":[{"sig":"MEUCIHX3V5FhHdAHoS0SQuToKivYR9hMpkscJHYzJu3fggKFAiEA+EGULNyt2+PyJH6JfojQuR6U0ma+RHiXNDpiWUTqSqQ=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":112451,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJioWLIACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrJJA//ZJYhlK99qHaRp9Kt32kwsj6W6box96Kw7A1Xq3oNG6cBqBJx\r\ntbvDPI9S08ZqCW81Gn67B7klN7FitVFw7V30qigySs/2wDa1NLSbOQKrzbZz\r\nzyi4G4ld3MdbOquwwLmAoOFhb+HoJ7OGOFBMRnlXXcGb/Abz+VTroUWN6P34\r\nv9IX9ck8NBhkATViTt4GmKfnMOsm1KquZ6J2qj5zhVHqXFlcP3wEQ/tvDbuz\r\nv7fc7fIw6VEkLZcxfQKBcNiGTqqc4s/oU2yoUagPzf1PyOLchyBZjs2X4aR9\r\nNBvC/JJvjqej3W857U2QFnLfTvKiwEjlhNFBf87Opj7MncRQkdFYmOnMs+XS\r\nCqTfLcdGRzOy+QCIAOBp3DLyXl28V8H/jX3wXSiJRORcEmpg/0sa3vG1/CAw\r\nuvdpTnqluQrE3wp8wuwcAo9XzN0go7i6wowjdEp/+k3bXenH6yJbyfbiajeS\r\nabkjLSFZHCyzo08wVFqzkU0vo5ELy3NW5y6sVuSpRA9NHkcD8+jN2UyGC8PK\r\nLLqelngv8Nr0zECqVamDeMDkbVfbyaa3kIy9J30cjUQLsVADSHCSXUtUOQ/H\r\n0L2W6GUzLeyvWfu4cKr5wfZReWXEG+z/KnURtId/iY0/w6E6b7FWuyhwkXLb\r\nLZpvuq7kc7PAiOfQ5nGqBzeC9r8imnKAaZM=\r\n=WJZ9\r\n-----END PGP SIGNATURE-----\r\n"},"jest":{"preset":"ts-jest","testEnvironment":"node","coverageThreshold":{"global":{"lines":10,"branches":10,"functions":10,"statements":10}},"coveragePathIgnorePatterns":["/node_modules/","/test/"]},"main":"dist/index.js","engines":{"node":">=8.0.0"},"gitHead":"434ec90ea59205c4ce67019f58c7144c54afd134","scripts":{"ci":"npm run lint && npm run test","tsc":"rm -rf dist && tsc -p tsconfig.prod.json","lint":"eslint . --ext .js,.jsx,.ts,.tsx","test":"jest --coverage test/**","prepare":"husky install","release":"standard-version","prerelease":"npm run lint && npm run test && npm run tsc ","test:watch":"yarn test --watch","release:beta":"npm run release -- --prerelease beta"},"_npmUser":{"name":"lengthmin","email":"lengthmin@gmail.com"},"commitlint":{"extends":["@commitlint/config-conventional"]},"repository":{"url":"git+ssh://git@github.com/opensumi/di.git","type":"git"},"_npmVersion":"6.14.17","description":"A dependency injection tool for Javascript.","directories":{},"lint-staged":{"*.ts":["eslint --fix","prettier --write"]},"_nodeVersion":"14.19.3","dependencies":{"reflect-metadata":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^28.1.0","husky":"^8.0.1","eslint":"^8.16.0","ts-jest":"^28.0.3","prettier":"2.6.2","commitlint":"^17.0.1","typescript":"^4.7.2","@types/jest":"^27.5.1","@types/node":"^17.0.36","lint-staged":"^12.4.3","@commitlint/cli":"^17.0.1","standard-version":"^9.5.0","eslint-config-prettier":"^8.5.0","@typescript-eslint/parser":"^5.26.0","@commitlint/config-conventional":"^17.0.0","@typescript-eslint/eslint-plugin":"^5.26.0"},"standard-version":{"bumpFiles":[{"updater":"./scripts/versionUpdater.js","filename":"./src/constants.ts"},{"type":"json","filename":"package.json"}]},"_npmOperationalInternal":{"tmp":"tmp/di_1.4.0_1654743751857_0.11877700239180622","host":"s3://npm-registry-packages"}},"1.5.0":{"name":"@opensumi/di","version":"1.5.0","keywords":["di","injector"],"license":"MIT","_id":"@opensumi/di@1.5.0","maintainers":[{"name":"ricbet","email":"18676769065@163.com"},{"name":"hacke2","email":"hacke2cn@gmail.com"},{"name":"jinboker","email":"jinboker@foxmail.com"},{"name":"ensorrow","email":"1121264060@qq.com"},{"name":"sakuraash","email":"binshao54@gmail.com"},{"name":"erha19","email":"faterrole@gmail.com"},{"name":"lengthmin","email":"lengthmin@gmail.com"}],"homepage":"https://github.com/opensumi/di#readme","bugs":{"url":"https://github.com/opensumi/di/issues"},"dist":{"shasum":"d1d4b3ffe80d4fc88faab1915f67bb0542746104","tarball":"https://registry.npmjs.org/@opensumi/di/-/di-1.5.0.tgz","fileCount":36,"integrity":"sha512-9yiVpf6HpgaWb1KYr1Ly6eUlp7lYaQ42lniNk8pA/Ei110t0yaUKARSPSgvA98J0Cc8GiTqfW9FnD0bRVFanAw==","signatures":[{"sig":"MEYCIQDej56YumVW0vtIf2jP5iVwyzGMxeghSHawWfxAMXrTwwIhAJJEfEIJDppqoR/RZU8yeAliIprO74S9hrGN49975KmV","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":112680,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJisCj7ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrdTQ//flxCiBT/PHXv+9794Ah5WqMyMVVMk1eN800+4MGjAK8bSHPt\r\neOjZ7TJojSWjNvtjy8gAbRuhbovdwNCOU5wmjsHd5uu4515GcH8Fnw3SEN2p\r\nv0pr2ISyvUV+5vQxllsV3ULM7/s/ZlwKwYmh88nPhrPMYnyAxD68bn8jjlyo\r\nobwWhzq/h5Uf+U9gHP5biwnEdSIPcWo3g2RURnvnl3kU+SdtIGR3a8PpKEIg\r\n4dsmF+Q3hMUWVuLNWJ3lNvDu/nKcxzbEOnIOfTZZQvE98xNvWeh/x9PnFG3Y\r\nwbSUWYg/KltWJeRts+qdpdmECNXH/w/97Fh9tAEZsfxUh9OUngX0t9q2/AqR\r\nXsFM9G4okyEJjDhHBhE8ydn4Kbb8bE1BHMyo7Hs+Woce/C2Qu7kVlldt1KBE\r\nD8EmgvnzuDCNwSm/KnvSoMXecOF06NjN7LNKVNMmNij2eCXhR7H1pO1F9OMz\r\nXmL/t1M4mKUdL8Tab1HWiDmwMy8uGrN1e0msfu0obqcLvkSBIGdIWS6xd5Zs\r\n5JSNUPCNUHTrF2QunAr5+a8vBtRl8WX9nyTdZVPYm9yk7L1gu6okYi0nBkot\r\njyfrfOV3B6jXp7mGp00yvYV9eS98HcMBoBQBCqoodwYa9HGL/l7qs7XE4nVY\r\ni3s7CirP+J3pwl1tjDnSi1Rbtyjxw1o/g+g=\r\n=tnuL\r\n-----END PGP SIGNATURE-----\r\n"},"jest":{"preset":"ts-jest","testEnvironment":"node","coverageThreshold":{"global":{"lines":10,"branches":10,"functions":10,"statements":10}},"coveragePathIgnorePatterns":["/node_modules/","/test/"]},"main":"dist/index.js","engines":{"node":">=8.0.0"},"gitHead":"1a3b46b3a647de2352dd25718b0da286cdc94023","scripts":{"ci":"npm run lint && npm run test","tsc":"rm -rf dist && tsc -p tsconfig.prod.json","lint":"eslint . --ext .js,.jsx,.ts,.tsx","test":"jest --coverage test/**","prepare":"husky install","release":"standard-version","prerelease":"npm run lint && npm run test && npm run tsc ","test:watch":"yarn test --watch","release:beta":"npm run release -- --prerelease beta"},"_npmUser":{"name":"lengthmin","email":"lengthmin@gmail.com"},"commitlint":{"extends":["@commitlint/config-conventional"]},"repository":{"url":"git+ssh://git@github.com/opensumi/di.git","type":"git"},"_npmVersion":"6.14.17","description":"A dependency injection tool for Javascript.","directories":{},"lint-staged":{"*.ts":["eslint --fix","prettier --write"]},"_nodeVersion":"14.19.3","dependencies":{"reflect-metadata":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^28.1.0","husky":"^8.0.1","eslint":"^8.16.0","ts-jest":"^28.0.3","prettier":"2.6.2","commitlint":"^17.0.1","typescript":"^4.7.2","@types/jest":"^27.5.1","@types/node":"^17.0.36","lint-staged":"^12.4.3","@commitlint/cli":"^17.0.1","standard-version":"^9.5.0","eslint-config-prettier":"^8.5.0","@typescript-eslint/parser":"^5.26.0","@commitlint/config-conventional":"^17.0.0","@typescript-eslint/eslint-plugin":"^5.26.0"},"standard-version":{"bumpFiles":[{"updater":"./scripts/versionUpdater.js","filename":"./src/constants.ts"},{"type":"json","filename":"package.json"}]},"_npmOperationalInternal":{"tmp":"tmp/di_1.5.0_1655711995145_0.5859643139872157","host":"s3://npm-registry-packages"}},"1.6.0-beta.0":{"name":"@opensumi/di","version":"1.6.0-beta.0","keywords":["di","injector"],"license":"MIT","_id":"@opensumi/di@1.6.0-beta.0","maintainers":[{"name":"ricbet","email":"18676769065@163.com"},{"name":"hacke2","email":"hacke2cn@gmail.com"},{"name":"jinboker","email":"jinboker@foxmail.com"},{"name":"ensorrow","email":"1121264060@qq.com"},{"name":"sakuraash","email":"binshao54@gmail.com"},{"name":"erha19","email":"faterrole@gmail.com"},{"name":"lengthmin","email":"lengthmin@gmail.com"}],"homepage":"https://github.com/opensumi/di#readme","bugs":{"url":"https://github.com/opensumi/di/issues"},"dist":{"shasum":"d8059a2ecb11dae5b5b26675d110e3660becf34a","tarball":"https://registry.npmjs.org/@opensumi/di/-/di-1.6.0-beta.0.tgz","fileCount":36,"integrity":"sha512-TfIrulay67SJN/J8ThpDM6JOGucN51ucHWbwSz/TcNk6PUmxZdNa54fpCuGP4Zkzzv9hlSeV/Ol5HvzXy2UQXg==","signatures":[{"sig":"MEQCIHJgn9BxbCXieZOAhXlmokVNPYHVEJ0KDhus0upswUY5AiAYJ9ePsFjfNS4JW5dCxUVTOQGy1W+RJpOaL8U5E/Mp7g==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":112463,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi0TQ2ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqUpg//fYDgn7mvSejMDSqmGOku81e61yw0+PV7wjSM6GbTDkQW1vOf\r\nugK7L8889KTAH/fVQOA/YFYbTcC/q4rkVbHWAVRLvr79WuPrsmX/9N6pnhuU\r\ngKgttIKWEnw5Jg/PJZEBbQ8iKqXob0FVV721x851mRSMweXXjQGKD8hSkcvg\r\n5TqOp/lsqyC5eXW7E0jtrjX2FQvBvnUil54mHwKER/xS4z6xw7OeSNVVT8vS\r\ngihYl5ooPqFmUI0xNOptm7hX4rER6KCijDCvbJryayuZaHxwG/dpcsmrgTxl\r\n8He7ibu9qxmLIcR0kvwzCgPL/UdDWjdvpcg3qYvv1aCpcnv9jkweu30D4tSR\r\nmqURfU0jjbL+M3hk3zQd2PtslgZU/Trbby87ugdfoOdhtdxkQ48nhCeAJT1f\r\nzOkenyYCNS36cP1FWFjlIDNDVc7lKXp5KMhqcFvWNT0rDKX0xNBg7m3/7m6x\r\nXIozu5kAfc2GVPOu5v97+YauiVkQA4+qlgP+kgk0gs2eEg8AILrFfFklDvJD\r\nKAUbYLuTJxUVn4hNuATj4H7zdrtFRzLlDDRpDyJOs8A+8FSqcV2qpEIra+9x\r\nYJQ8cPVPTYM2Nuo/NCyxg6eryJxYCtN0R9EYs7qYV2xWDSEfHNe3+WwY0d01\r\nR8CDQ5/2Mz15stZFfpO8n0ptfpTNskUM/QA=\r\n=vY9V\r\n-----END PGP SIGNATURE-----\r\n"},"jest":{"preset":"ts-jest","testEnvironment":"node","coverageThreshold":{"global":{"lines":10,"branches":10,"functions":10,"statements":10}},"coveragePathIgnorePatterns":["/node_modules/","/test/"]},"main":"dist/index.js","readme":"# @opensumi/di\n\n[![CI](https://github.com/opensumi/di/actions/workflows/ci.yml/badge.svg)](https://github.com/opensumi/di/actions/workflows/ci.yml) [![NPM Version][npm-image]][npm-url] [![NPM downloads][download-image]][download-url] [![Test Coverage][test-image]][test-url] [![License][license-image]][license-url]\n\n[npm-image]: https://img.shields.io/npm/v/@opensumi/di.svg\n[npm-url]: https://www.npmjs.com/package/@opensumi/di\n[download-image]: https://img.shields.io/npm/dm/@opensumi/di.svg\n[download-url]: https://npmjs.org/package/@opensumi/di\n[license-image]: https://img.shields.io/npm/l/@opensumi/di.svg\n[license-url]: https://github.com/opensumi/di/blob/main/LICENSE\n[test-image]: https://codecov.io/gh/opensumi/di/branch/main/graph/badge.svg?token=07JAPLU957\n[test-url]: https://codecov.io/gh/opensumi/di\n\n> Inspired By [Angular](https://angular.io/guide/dependency-injection).\n\n这个工具将会帮助你很好的帮助你实现依赖反转，而不在关系那些对象实例化的细节。同时，因为对象的实例化在注册器中进行创建，所以工厂模式和单例模式都很容易实现。\n\n## Table of Contents\n\n- [Install](#install)\n- [Usage](#usage)\n- [API](#API)\n- [Example Readmes](#example-readmes)\n- [Related Efforts](#related-efforts)\n\n## Install\n\n```sh\nnpm install @opensumi/di --save\nyarn add @opensumi/di\n```\n\n## Usage\n\n### Token\n\n查找实例的唯一标记，类型描述如下：\n\n```ts\nexport type Token = string | symbol | Function;\n```\n\n### Provider\n\n为 Token 提供实例的定义，一共有五种类型的 Provider 定义：\n\n```ts\nexport type Provider = ClassProvider | TypeProvider | ValueProvider | FactoryProvider | AliasProvider;\n```\n\n#### ClassProvider\n\n定义一个 Token 使用某个特定的构造函数的时候会用到的 Provider。\n\n```ts\nexport interface ClassProvider {\n  token: Token;\n  useClass: ConstructorOf<any>;\n}\n```\n\n在依赖反转之后，构造函数都依赖抽象而不依赖实例的时候会非常有效。比如下面的例子：\n\n```ts\ninterface Drivable {\n  drive(): void;\n}\n\n@Injectable()\nclass Student {\n  @Autowired('Drivable')\n  mBike: Drivable;\n\n  goToSchool() {\n    console.log('go to school');\n    this.mBike.drive();\n  }\n}\n```\n\n学生对象依赖的是一个可驾驶的交通工具，可以在创建对象的时候提供一个自行车，也可以在创建的时候提供一个汽车：\n\n```ts\n@Injectable()\nclass Car implements Drivable {\n  drive() {\n    console.log('by car');\n  }\n}\n\ninjector.addProviders(Student);\ninjector.addProviders({\n  token: 'Drivable',\n  useClass: Car,\n});\n\nconst student = injector.get(Student);\nstudent.goToSchool(); // print 'go to school by car'\n```\n\n#### TypeProvider\n\ntoken 和 useClass 都是一样的 ClassProvider，一般不会直接用到，使用 Autowired 如果是一个 Function，就会转换成这个类型。\n\n#### ValueProvider\n\n和 ClassProvider 一样作用，但是直接提供一个对象实例的 Provider。\n\n```ts\nexport interface ValueProvider {\n  token: Token;\n  useValue: any;\n}\n```\n\n#### FactoryProvider\n\n和 ClassProvider 一样作用，但是提供一个函数进行对象实例创建的 Provider。\n\n```ts\nexport interface FactoryFunction<T = any> {\n  (injector: Injector): T;\n}\nexport interface FactoryProvider {\n  token: Token;\n  useFactory: FactoryFunction<T>;\n}\n```\n\n同时也提供了一些工厂模式的帮助函数：\n\n1. `asSingleton`\n\n可以实现工厂单例：\n\n```ts\nconst provider = {\n  token,\n  useFactory: asSingleton(() => new A()),\n};\n```\n\n#### AliasProvider\n\n将一个 token 设为已存在的一个 token 的 alias。\n\n```ts\nexport interface ValueProvider {\n  // 新的 Token\n  token: Token;\n  // 已添加的 Token\n  useAlias: Token;\n}\n```\n\n### 对 Constructor 进行构造注入\n\n```ts\n@Injectable()\nclass A {\n  constructor() {\n    console.log('Create A');\n  }\n}\n\n@Injectable()\nclass B {\n  constructor(public a: A) {}\n}\n\nconst injector = new Injector();\ninjector.addProviders(A, B);\n\nconst b = injector.get(B); // print 'Create A'\nconsole.log(b.a instanceof A); // print 'true'\n```\n\n### 使用 Autowired 进行动态注入\n\n```ts\n@Injectable()\nclass A {\n  constructor() {\n    console.log('Create A');\n  }\n}\n\n@Injectable()\nclass B {\n  @Autowired()\n  a: A;\n}\n\nconst injector = new Injector();\ninjector.addProviders(A, B);\n\nconst b = injector.get(B);\nconsole.log(b.a instanceof A); // print 'Create A'; print 'true'\n```\n\n### 单例与多例的用法\n\n```ts\n@Injectable()\nclass Single {\n  constructor() {}\n}\n\n@Injectable({ multiple: true })\nclass Multiple {\n  constructor() {}\n}\n\nconst injector = new Injector();\ninjector.addProviders(Single, Multiple);\n\nconst single1 = injector.get(Single);\nconst single2 = injector.get(Single);\nconsole.log(single1 === single2); // print 'true'\n\nconst multiple1 = injector.get(Multiple);\nconst multiple2 = injector.get(Multiple);\nconsole.log(multiple1 === multiple2); // print 'false'\n```\n\n### 类型依赖抽象而不是依赖实现的用法\n\n```ts\nconst LOGGER_TOKEN = Symbol('LOGGER_TOKEN');\n\ninterface Logger {\n  log(msg: string): void;\n}\n\n@Injectable()\nclass App {\n  @Autowired(LOGGER_TOKEN)\n  logger: Logger;\n}\n\n@Injectable()\nclass LoggerImpl implements Logger {\n  log(msg: string) {\n    console.log(msg);\n  }\n}\n\nconst injector = new Injector();\ninjector.addProviders(App);\ninjector.addProviders({\n  token: LOGGER_TOKEN,\n  useClass: LoggerImpl,\n});\n\nconst app = injector.get(App);\nconsole.log(app.logger instanceof LoggerImpl); // print 'true'\n```\n\n### 使用抽象函数作为 Token 进行依赖注入\n\n```ts\nabstract class Logger {\n  abstract log(msg: string): void;\n}\n\n@Injectable()\nclass LoggerImpl implements Logger {\n  log(msg: string) {\n    console.log(msg);\n  }\n}\n\n@Injectable()\nclass App {\n  @Autowired()\n  logger: Logger;\n}\n\nconst injector = new Injector();\ninjector.addProviders(App);\ninjector.addProviders({\n  token: Logger,\n  useClass: LoggerImpl,\n});\n\nconst app = injector.get(App);\nconsole.log(app.logger instanceof LoggerImpl); // print 'true'\n```\n\n## API\n\n### @Injectable\n\n```ts\ninterface InstanceOpts {\n  multiple?: boolean;\n}\nfunction Injectable(opts?: InstanceOpts): ClassDecorator;\n\n@Injectable({ multiple: true })\nclass A {}\n\nconst injector = new Injector([A]);\n\nconst a = injector.get(A);\nconsole.log(injector.hasInstance(a)); // print 'false'\n```\n\n所有需要被 Injector 创建的构造函数都应该使用这个装饰器修饰才可以正常使用，否则会报错\n\n- multiple: 是否启用多例模式，一旦启用了多例模式之后，Injector 将不会持有实例对象的引用。\n\n### @Autowired\n\n```ts\nfunction Autowired(token?: Token): PropertyDecorator;\n\n@Injectable()\nclass A {}\n\n@Injectable()\nclass B {\n  @Autowired()\n  a: A;\n}\n```\n\n修饰一个属性会被注册器动态创建依赖实例，而这个依赖实例只有在被使用的时候才会被创建出来。比如上面的例子中，只有访问到 `b.a` 的时候，才会创建 A 的实例。\n\n> 需要注意的是，因为 Autowired 依赖着 Injector 的实例，所以只有从 Injector 创建出来的对象可以使用这个装饰器\n\n### @Inject\n\n```ts\nfunction Inject(token: string | symbol): ParameterDecorator;\n\ninterface IA {\n  log(): void;\n}\n\n@Injectable()\nclass B {\n  constructor(@Inject('IA') a: IA) {}\n}\n```\n\n在构造函数进行依赖注入的时候，需要特别指定依赖 Token 的时候的装饰器。当一个构造函数依赖某个抽象，并且这个抽象是在构造函数中传递进来的时候，会需要使用这个装饰器。\n\n### Injector.get\n\n多态实现：\n\n```ts\ninterface Injector<T extends Token> {\n  get(token: ConstructorOf<any>, args?: ConstructorParameters<T>, opts?: InstanceOpts): TokenResult<T>;\n  get(token: T, opts?: InstanceOpts): TokenResult<T>;\n}\n```\n\n从 Injector 获取一个对象实例的方法，如果传递的是一个构造函数，第二个参数可以传递构造函数 Arguments 数据，此时将会直接将构造函数创建实例返回，并附加依赖注入的功能，此时的构造函数不需要被 Injectable 装饰也能正常创建对象。例如下面这样：\n\n```ts\n@Injectable()\nclass A {}\n\nclass B {\n  @Autowired()\n  a: A;\n}\n\nconst injector = new Injector([A]);\nconst b = injector.get(B, []);\nconsole.log(b.a instanceof A); // print 'true'\n```\n\n### Injector.hasInstance\n\nInjector 中是否具备某个对象的单例引用\n\n### markInjectable\n\nYou can use this function mark some Class as Injectable.\n\n## Example Readmes\n\nMore Example [you can see here](test/use-case.test.ts).\n\n## Related Efforts\n\n- [Angular](https://angular.io/guide/dependency-injection) Dependency injection in Angular\n- [injection-js](https://github.com/mgechev/injection-js) It is an extraction of the Angular's ReflectiveInjector.\n- [InversifyJS](https://github.com/inversify/InversifyJS) A powerful and lightweight inversion of control container for JavaScript & Node.js apps powered by TypeScript.\n- [power-di](https://github.com/zhang740/power-di) A lightweight Dependency Injection library.\n","engines":{"node":">=8.0.0"},"gitHead":"58884f3d2201433d2dc7aeb551bc5b823cbb1c61","scripts":{"ci":"npm run lint && npm run test","lint":"eslint . --ext .js,.jsx,.ts,.tsx","test":"jest --coverage test/**","build":"rm -rf dist && tsc -p tsconfig.prod.json","prepare":"husky install","release":"standard-version","prerelease":"npm run lint && npm run test && npm run build","test:watch":"yarn test --watch","release:beta":"npm run release -- --prerelease beta"},"_npmUser":{"name":"lengthmin","email":"lengthmin@gmail.com"},"commitlint":{"extends":["@commitlint/config-conventional"]},"repository":{"url":"git+ssh://git@github.com/opensumi/di.git","type":"git"},"_npmVersion":"6.14.17","description":"A dependency injection tool for Javascript.","directories":{},"lint-staged":{"*.ts":["eslint --fix","prettier --write"]},"_nodeVersion":"14.19.3","dependencies":{"reflect-metadata":"^0.1.13"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jest":"28.1.3","husky":"8.0.1","eslint":"8.19.0","ts-jest":"28.0.6","prettier":"2.7.1","commitlint":"17.0.3","typescript":"4.7.4","@types/jest":"28.1.5","@types/node":"17.0.45","lint-staged":"13.0.3","@commitlint/cli":"17.0.3","standard-version":"9.5.0","eslint-config-prettier":"8.5.0","@typescript-eslint/parser":"5.30.6","@commitlint/config-conventional":"17.0.3","@typescript-eslint/eslint-plugin":"5.30.6"},"standard-version":{"bumpFiles":[{"updater":"./scripts/versionUpdater.js","filename":"./src/constants.ts"},{"type":"json","filename":"package.json"}]},"_npmOperationalInternal":{"tmp":"tmp/di_1.6.0-beta.0_1657877558127_0.7644161135590468","host":"s3://npm-registry-packages"}},"1.6.0":{"name":"@opensumi/di","version":"1.6.0","keywords":["di","injector"],"license":"MIT","_id":"@opensumi/di@1.6.0","maintainers":[{"name":"ricbet","email":"18676769065@163.com"},{"name":"hacke2","email":"hacke2cn@gmail.com"},{"name":"jinboker","email":"jinboker@foxmail.com"},{"name":"ensorrow","email":"1121264060@qq.com"},{"name":"sakuraash","email":"binshao54@gmail.com"},{"name":"erha19","email":"faterrole@gmail.com"},{"name":"lengthmin","email":"lengthmin@gmail.com"}],"homepage":"https://github.com/opensumi/di#readme","bugs":{"url":"https://github.com/opensumi/di/issues"},"dist":{"shasum":"10fe4993be4c7445da19f7cb3f88a93ab2c94453","tarball":"https://registry.npmjs.org/@opensumi/di/-/di-1.6.0.tgz","fileCount":36,"integrity":"sha512-O41vSN19tE/95cpC9wnOmQuztkUP5d5zUJrw0KUDaEqIuFbS7dJRgs/1Jfwyic07O9PoiVlKo+Pj6MwV43i5Ww==","signatures":[{"sig":"MEUCIGQyqeB//0+r9aaip8SQ7qQXtjRa7JUeIvIIFxsJ0wg7AiEAscOdf7Hg7EXBEB2ogp1X1hG4GTTNdkU8nliM1quQ5kk=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":112553,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi0TZjACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqgjhAAir9E/reDJYGn6teX+fZq/egQv8so+AP/A0TF4f7JoX3AKm+C\r\n2SgdA6/xib6MCTsCDK7AGsleirMdLy8GzXqnPomrEVwuEEMRiv0bOrtyH1gj\r\nRU8bNLx4ZnZvV04GRSUhCkYLGzzx3+u5BeMIThJYakxEIpxtMygtJEwMu6lh\r\nxmRaGowkv2Mq0DRovNJmeEeGbyRvgimLsJsaowIqpH9+UffWPnBl3nqI85HJ\r\nmCIALEL54kejik78/TZeygpmfFgAFuonfMEAhhbH7izSobbByhbULCduP5Jq\r\n6sQ+W6BjYYjyci1R/EgmXAyQUyzZOAEZITE8cMW4uwWQJma8MtthXRcOTiIg\r\nyeq5JuRD2q5dKxjM9NY2FAtD2CZUluGKuhNSDOFOjNxiQGV6uRbCmihl9Kt3\r\njBu2nO1NlfSoMxcUGr/2TEw7gPpNZnyYRkqp1UUS8VHMsC8nBNLe9QHc97QM\r\nZptd0bxFul4rKbmTDbUAzlmzBSgVibMNXt6Eq+z3b6l59CiMbUZDTCODkG1v\r\n590q/NbC74v1LI0oW/tmWdR0QIZy6enl2c23X/rtUPci+ZXJhOV+Ze1gyJZp\r\nxcdS5pm9K+4esMhEdU2F0xfyF8OjrItSa1qPfaxJpLT3XhzVQzcsYnRJqcqm\r\nyZ8JFpj8VjCm7kykTWPNSGktwHHRNLBIBz4=\r\n=VRhT\r\n-----END PGP SIGNATURE-----\r\n"},"jest":{"preset":"ts-jest","testEnvironment":"node","coverageThreshold":{"global":{"lines":10,"branches":10,"functions":10,"statements":10}},"coveragePathIgnorePatterns":["/node_modules/","/test/"]},"main":"dist/index.js","engines":{"node":">=8.0.0"},"gitHead":"37ebb0ad951cdb7f454561d5f28c890f5d270703","scripts":{"ci":"npm run lint && npm run test","lint":"eslint . --ext .js,.jsx,.ts,.tsx","test":"jest --coverage test/**","build":"rm -rf dist && tsc -p tsconfig.prod.json","prepare":"husky install","release":"standard-version --silent","prerelease":"npm run lint && npm run test && npm run build","test:watch":"yarn test --watch","release:beta":"npm run release -- --prerelease beta"},"_npmUser":{"name":"lengthmin","email":"lengthmin@gmail.com"},"commitlint":{"extends":["@commitlint/config-conventional"]},"repository":{"url":"git+ssh://git@github.com/opensumi/di.git","type":"git"},"_npmVersion":"6.14.17","description":"A dependency injection tool for Javascript.","directories":{},"lint-staged":{"*.ts":["eslint --fix","prettier --write"]},"_nodeVersion":"14.20.0","dependencies":{"reflect-metadata":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"jest":"28.1.3","husky":"8.0.1","eslint":"8.19.0","ts-jest":"28.0.6","prettier":"2.7.1","commitlint":"17.0.3","typescript":"4.7.4","@types/jest":"28.1.5","@types/node":"17.0.45","lint-staged":"13.0.3","@commitlint/cli":"17.0.3","standard-version":"9.5.0","eslint-config-prettier":"8.5.0","@typescript-eslint/parser":"5.30.6","@commitlint/config-conventional":"17.0.3","@typescript-eslint/eslint-plugin":"5.30.6"},"standard-version":{"bumpFiles":[{"updater":"./scripts/versionUpdater.js","filename":"./src/constants.ts"},{"type":"json","filename":"package.json"}]},"_npmOperationalInternal":{"tmp":"tmp/di_1.6.0_1657878115631_0.04794027601770989","host":"s3://npm-registry-packages"}},"1.7.0":{"name":"@opensumi/di","version":"1.7.0","keywords":["di","injector"],"license":"MIT","_id":"@opensumi/di@1.7.0","maintainers":[{"name":"ricbet","email":"18676769065@163.com"},{"name":"hacke2","email":"hacke2cn@gmail.com"},{"name":"jinboker","email":"jinboker@foxmail.com"},{"name":"ensorrow","email":"1121264060@qq.com"},{"name":"sakuraash","email":"binshao54@gmail.com"},{"name":"erha19","email":"faterrole@gmail.com"},{"name":"lengthmin","email":"lengthmin@gmail.com"}],"homepage":"https://github.com/opensumi/di#readme","bugs":{"url":"https://github.com/opensumi/di/issues"},"dist":{"shasum":"2cc30061462a2633a5b7b3b5449ed38796db8592","tarball":"https://registry.npmjs.org/@opensumi/di/-/di-1.7.0.tgz","fileCount":36,"integrity":"sha512-pB2NeCktB2cIlQNX6kih5xP5pN8Z2uQz5G2tkhSpTr36cn8UDLi8nZyGvNoDUTN8kOI7XB7sYA6xf+tgbLKkEg==","signatures":[{"sig":"MEUCIQDQmQZy/28/Hluar0wTYrVurUxcROO7dHE4mjyBtKg3OQIgH+7HLNsVi8xJE3fusIbE/DDW3TydpBanpiCK0eVLCg8=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":114289,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi06wtACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoNwg/9HqdpIMurWUxIiVPtF9OqjyQqKfPZwXxNL6LGtcL+DzfIsmQn\r\nkqq9fjsFX9RmQSWjWJUzfEkSW8KLwveWsVec6iragzIZS1WXFR4kEdiM1BIk\r\nHOfm5iv1F5dU6JK6rlVJKl/hQtgp/MVis7sxDlvJs2QgBF81LUh4OgNd726q\r\nh571DIzSTWV7meztBVoiwyzi58ysPoZBRGLm6T/+csDhwEfvQ7TWQi2veXcf\r\nHWX7pI1cxn3oCbcauvAwq1vkOCZS5TLhh86LsxKGKu21mu2M66PZATUMdidt\r\nK5ItF01Ju84tRJJAT3VpJrclw7F4B8jZe3ECZkRmtREFR6VOvY5hCdYA44Jm\r\ns9DU2wK87sUgBz3GAoeU5ug9Iv/5L9cglmbiX+jPCARiqN+F2VQnZrfBjF3O\r\nNm6bxqd6yOMku05y9Hq8B+P3GbqZh0ZoGNUPOeOHJeuf3JKkQiBqGaiaM2wT\r\ntJK0JN44Q+g31uhameNzf01bX6iQ6p+UUhhPG+tWyQ6APprnNL6jEj/rieRO\r\n2GSQviALUx0OHnTi/gu8z9BC2KCs3AWksx+pL8CmYdI7qr/p9T1BQyxIMMDz\r\nD6uTkkoe0/gkwHt6I/VOLZZa/50pjOLbYadnPwH4ggXM0ReBp9lFY9hkp6JV\r\nDtN4EsYx8FtpAFl0pDdilNN6PpmU/0FVRq0=\r\n=57LF\r\n-----END PGP SIGNATURE-----\r\n"},"jest":{"preset":"ts-jest","testEnvironment":"node","coverageThreshold":{"global":{"lines":10,"branches":10,"functions":10,"statements":10}},"coveragePathIgnorePatterns":["/node_modules/","/test/"]},"main":"dist/index.js","engines":{"node":">=8.0.0"},"gitHead":"1e4a3fa9a17bb07bcbcf20d82db8e5ee2b01793a","scripts":{"ci":"npm run lint && npm run test","lint":"eslint . --ext .js,.jsx,.ts,.tsx","test":"jest --coverage test/**","build":"rm -rf dist && tsc -p tsconfig.prod.json","prepare":"husky install","release":"standard-version","prerelease":"npm run lint && npm run test && npm run build","test:watch":"yarn test --watch","release:beta":"npm run release -- --prerelease beta"},"_npmUser":{"name":"lengthmin","email":"lengthmin@gmail.com"},"commitlint":{"extends":["@commitlint/config-conventional"]},"repository":{"url":"git+ssh://git@github.com/opensumi/di.git","type":"git"},"_npmVersion":"6.14.17","description":"A dependency injection tool for Javascript.","directories":{},"lint-staged":{"*.ts":["eslint --fix","prettier --write"]},"_nodeVersion":"14.20.0","dependencies":{"reflect-metadata":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"jest":"28.1.3","husky":"8.0.1","eslint":"8.19.0","ts-jest":"28.0.6","prettier":"2.7.1","commitlint":"17.0.3","typescript":"4.7.4","@types/jest":"28.1.5","@types/node":"17.0.45","lint-staged":"13.0.3","@commitlint/cli":"17.0.3","standard-version":"9.5.0","eslint-config-prettier":"8.5.0","@typescript-eslint/parser":"5.30.6","@commitlint/config-conventional":"17.0.3","@typescript-eslint/eslint-plugin":"5.30.6"},"standard-version":{"bumpFiles":[{"updater":"./scripts/versionUpdater.js","filename":"./src/constants.ts"},{"type":"json","filename":"package.json"}]},"_npmOperationalInternal":{"tmp":"tmp/di_1.7.0_1658039341261_0.04886931811580042","host":"s3://npm-registry-packages"}},"1.8.0":{"name":"@opensumi/di","version":"1.8.0","keywords":["di","injector"],"license":"MIT","_id":"@opensumi/di@1.8.0","maintainers":[{"name":"ricbet","email":"18676769065@163.com"},{"name":"hacke2","email":"hacke2cn@gmail.com"},{"name":"jinboker","email":"jinboker@foxmail.com"},{"name":"ensorrow","email":"1121264060@qq.com"},{"name":"sakuraash","email":"binshao54@gmail.com"},{"name":"erha19","email":"faterrole@gmail.com"},{"name":"lengthmin","email":"lengthmin@gmail.com"}],"homepage":"https://github.com/opensumi/di#readme","bugs":{"url":"https://github.com/opensumi/di/issues"},"dist":{"shasum":"b02959211241b0e32fad3928b47bfdab6e638cb3","tarball":"https://registry.npmjs.org/@opensumi/di/-/di-1.8.0.tgz","fileCount":36,"integrity":"sha512-iNqfySqXZdOmpEfTjd1u1QJrVGU2wxtKkOChUvix6vTr6iPVHgtHLJNoBmYTGzp+lVtF+sS0E4x1vNCPG9Q8NA==","signatures":[{"sig":"MEQCIHyfKLcSylNS/qsnW5/5oWHdUFXwFPiAxrj6d0j2fAGzAiBfYR6ZASIw5oOcAHUy3mhdKRrelrLtHl839/ClN9uaCw==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":116859,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi82VLACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmrq4xAAhBR0boXZn5LU+sJBW9+3fOFye00EV3rP9pOW0UTSWJe/BqEz\r\naaTKIVNGCh69NCWUoWM+l7QvFh4avtr73/afIZ/NJ8vTnk57nq+yIxF+qHNq\r\nrx9OFZryVvPv17prmvSQ0bZTSlzJ1DhhK/Iagkh7Q+nTZIveeElMK5TPQnGh\r\n0kGYsNxlHrQCDn+Q9oVXD49djXXFU9LejETVY6awFDkS3YWkPO0lsyK5D0hz\r\nno2ywyrtdgLxZ/x7pXhUi/LYF6UlhSywyK+LtqgArMTnGXQ1MW24pIkt7pn9\r\nyaJ0FrO/MlIOkEBQftSKX1S3G7avirh+pzwvrd8SgO0HlKk+Vf9vbKOFVsL3\r\neYLZ/dtJ6D4ffxruBw+UP3gEZiMKyFjEznggTobNYmjg6ZDOaLTqFdOrlYzN\r\ntPJiF0Vtfv4RBGYzlyuldJZCIcewU47uGW/PDNJ2g+BdxeioDLMrLA/TLNwf\r\nGZs+3Pi10Tm4RZckdKNxTbaMesPTwdlQR+9uC/nfv2W6SxiQyy/unAS7Ob8I\r\nwqmw9HotSciOjwRlX2fhD9IkRIH30zk4Lz+w5mQJ+0PwqoMS3Fviro5wLh0l\r\nnIa4lM9HtKhbhbyFoMEpKZk10boX+L/0MDaEBgeWtHBHhF8XnqhvFhbUF+4z\r\nRA8gXsiUKlpOS05NIsvOu8KzdAaul7Jmkjw=\r\n=Dfj4\r\n-----END PGP SIGNATURE-----\r\n"},"jest":{"preset":"ts-jest","testEnvironment":"node","coverageThreshold":{"global":{"lines":10,"branches":10,"functions":10,"statements":10}},"coveragePathIgnorePatterns":["/node_modules/","/test/"]},"main":"dist/index.js","engines":{"node":">=8.0.0"},"gitHead":"5e5699e36d23fe2d23b9d12cf3fd96271672fb1e","scripts":{"ci":"npm run lint && npm run test","lint":"eslint . --ext .js,.jsx,.ts,.tsx","test":"jest --coverage test/**","build":"rm -rf dist && tsc -p tsconfig.prod.json","prepare":"husky install","release":"standard-version","prerelease":"npm run lint && npm run test && npm run build","test:watch":"yarn test --watch","release:beta":"npm run release -- --prerelease beta"},"_npmUser":{"name":"lengthmin","email":"lengthmin@gmail.com"},"commitlint":{"extends":["@commitlint/config-conventional"]},"repository":{"url":"git+ssh://git@github.com/opensumi/di.git","type":"git"},"_npmVersion":"6.14.17","description":"A dependency injection tool for Javascript.","directories":{},"lint-staged":{"*.ts":["eslint --fix","prettier --write"]},"_nodeVersion":"14.20.0","dependencies":{"reflect-metadata":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"jest":"28.1.3","husky":"8.0.1","eslint":"8.21.0","ts-jest":"28.0.7","prettier":"2.7.1","commitlint":"17.0.3","typescript":"4.7.4","@types/jest":"28.1.6","@types/node":"17.0.45","lint-staged":"13.0.3","@commitlint/cli":"17.0.3","standard-version":"9.5.0","eslint-config-prettier":"8.5.0","@typescript-eslint/parser":"5.33.0","@commitlint/config-conventional":"17.0.3","@typescript-eslint/eslint-plugin":"5.33.0"},"standard-version":{"bumpFiles":[{"updater":"./scripts/versionUpdater.js","filename":"./src/constants.ts"},{"type":"json","filename":"package.json"}]},"_npmOperationalInternal":{"tmp":"tmp/di_1.8.0_1660118346820_0.8271044622207704","host":"s3://npm-registry-packages"}},"1.8.0-reflection.0":{"name":"@opensumi/di","version":"1.8.0-reflection.0","keywords":["di","injector"],"license":"MIT","_id":"@opensumi/di@1.8.0-reflection.0","maintainers":[{"name":"yantze","email":"yantze@126.com"},{"name":"ricbet","email":"18676769065@163.com"},{"name":"hacke2","email":"hacke2cn@gmail.com"},{"name":"jinboker","email":"jinboker@foxmail.com"},{"name":"ensorrow","email":"1121264060@qq.com"},{"name":"sakuraash","email":"binshao54@gmail.com"},{"name":"erha19","email":"faterrole@gmail.com"},{"name":"lengthmin","email":"lengthmin@gmail.com"}],"homepage":"https://github.com/opensumi/di#readme","bugs":{"url":"https://github.com/opensumi/di/issues"},"dist":{"shasum":"45c3cb4ddac9b060f04cbff48c43cdaa2ea9e301","tarball":"https://registry.npmjs.org/@opensumi/di/-/di-1.8.0-reflection.0.tgz","fileCount":35,"integrity":"sha512-GNgkAdm4SfyqLx1zDBJtlPo3vkBvXxEJkahEfOa3oJXHo9N7FqzUpkcOS4yuhVy+EDogl5/EscJfqBKLGSOTzA==","signatures":[{"sig":"MEUCIQDvnHJpI4edoUM6sc3UE3CaXBS+4DcH6JKQfsFScGdYFQIgRC776irag3nZN/pxBT3Mb+p6n8X9O+tlXLWnyXlZEdA=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":114978},"jest":{"preset":"ts-jest","testEnvironment":"node","coverageThreshold":{"global":{"lines":10,"branches":10,"functions":10,"statements":10}},"coveragePathIgnorePatterns":["/node_modules/","/test/"]},"main":"dist/index.js","types":"./dist/index.d.ts","engines":{"node":">=8.0.0"},"gitHead":"ab9e5ed903225d2714f6f63416916a380a1328bf","scripts":{"ci":"npm run lint && npm run test","lint":"eslint . --ext .js,.jsx,.ts,.tsx","test":"jest --coverage test/**","build":"rm -rf dist && tsc -p tsconfig.prod.json","prepare":"husky install","release":"standard-version","prerelease":"npm run lint && npm run test && npm run build","test:watch":"yarn test --watch","release:beta":"npm run release -- --prerelease beta"},"_npmUser":{"name":"lengthmin","email":"lengthmin@gmail.com"},"commitlint":{"extends":["@commitlint/config-conventional"]},"deprecated":"misoperation","repository":{"url":"git+ssh://git@github.com/opensumi/di.git","type":"git"},"_npmVersion":"8.19.4","description":"A dependency injection tool for Javascript.","directories":{},"lint-staged":{"*.ts":["eslint --fix","prettier --write"]},"_nodeVersion":"16.20.0","dependencies":{"@abraham/reflection":"^0.12.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"29.2.2","husky":"8.0.1","eslint":"8.27.0","ts-jest":"29.0.3","prettier":"2.7.1","commitlint":"17.2.0","typescript":"4.8.4","@types/jest":"29.2.2","@types/node":"18.11.9","lint-staged":"13.0.3","@commitlint/cli":"17.2.0","standard-version":"9.5.0","eslint-config-prettier":"8.5.0","@typescript-eslint/parser":"5.42.1","@commitlint/config-conventional":"17.2.0","@typescript-eslint/eslint-plugin":"5.42.1"},"standard-version":{"bumpFiles":[{"updater":"./scripts/versionUpdater.js","filename":"./src/constants.ts"},{"type":"json","filename":"package.json"}]},"_npmOperationalInternal":{"tmp":"tmp/di_1.8.0-reflection.0_1690965470415_0.5006238127427172","host":"s3://npm-registry-packages"}},"1.8.1":{"name":"@opensumi/di","version":"1.8.1","keywords":["di","injector"],"license":"MIT","_id":"@opensumi/di@1.8.1","maintainers":[{"name":"yantze","email":"yantze@126.com"},{"name":"ricbet","email":"18676769065@163.com"},{"name":"hacke2","email":"hacke2cn@gmail.com"},{"name":"jinboker","email":"jinboker@foxmail.com"},{"name":"ensorrow","email":"1121264060@qq.com"},{"name":"sakuraash","email":"binshao54@gmail.com"},{"name":"erha19","email":"faterrole@gmail.com"},{"name":"lengthmin","email":"lengthmin@gmail.com"}],"dist":{"shasum":"75de94d35c994f4fcf8db3c926016cb468560169","tarball":"https://registry.npmjs.org/@opensumi/di/-/di-1.8.1.tgz","fileCount":42,"integrity":"sha512-25pbG6TvRDdAM47ISyWy0j1iMTMD4FTEn5OUg9c/c3ifNM5YkfrYKgqFF29ktR7qzFdmgnsVEzZGvkY2mAGhaA==","signatures":[{"sig":"MEYCIQCNXPx9BUWz7ZBI1kwNLsGp8cDCMZx+ud8RYNd3xU0eXQIhAMv1Ij0XT9XH5z2kStrl36OmcHETVhPaqHYK7RcOnliy","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":129373},"jest":{"preset":"ts-jest","testEnvironment":"node","coverageThreshold":{"global":{"lines":10,"branches":10,"functions":10,"statements":10}},"coveragePathIgnorePatterns":["/node_modules/","/test/"]},"main":"dist/index.js","engines":{"node":">=8.0.0"},"scripts":{"ci":"npm run lint && npm run test","lint":"eslint . --ext .js,.jsx,.ts,.tsx","test":"jest --coverage test/**","build":"rm -rf dist && tsc -p tsconfig.prod.json","prepare":"husky install","release":"commit-and-tag-version","prerelease":"npm run lint && npm run test && npm run build","test:watch":"yarn test --watch","release:beta":"npm run release -- --prerelease beta"},"_npmUser":{"name":"lengthmin","email":"lengthmin@gmail.com"},"commitlint":{"extends":["@commitlint/config-conventional"]},"repository":{"url":"git@github.com:opensumi/di.git","type":"git"},"description":"A dependency injection tool for Javascript.","directories":{},"licenseText":"The MIT License (MIT)\n\nCopyright (c) 2019-present Alibaba Group Holding Limited, Ant Group Co. Ltd.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","lint-staged":{"*.ts":["eslint --fix","prettier --write"]},"dependencies":{"reflect-metadata":"^0.1.13"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"jest":"29.2.2","husky":"8.0.1","eslint":"8.27.0","ts-jest":"29.0.3","prettier":"2.7.1","commitlint":"17.2.0","typescript":"4.8.4","@types/jest":"29.2.2","@types/node":"18.11.9","lint-staged":"13.0.3","@commitlint/cli":"17.2.0","commit-and-tag-version":"^11.2.3","eslint-config-prettier":"8.5.0","@typescript-eslint/parser":"5.42.1","@commitlint/config-conventional":"17.2.0","@typescript-eslint/eslint-plugin":"5.42.1"},"standard-version":{"bumpFiles":[{"updater":"./scripts/versionUpdater.js","filename":"./src/constants.ts"},{"type":"json","filename":"package.json"}]},"_npmOperationalInternal":{"tmp":"tmp/di_1.8.1_1695712809255_0.22416265750237763","host":"s3://npm-registry-packages"}},"1.9.0":{"name":"@opensumi/di","version":"1.9.0","keywords":["di","injector"],"license":"MIT","_id":"@opensumi/di@1.9.0","maintainers":[{"name":"yantze","email":"yantze@126.com"},{"name":"ricbet","email":"18676769065@163.com"},{"name":"hacke2","email":"hacke2cn@gmail.com"},{"name":"jinboker","email":"jinboker@foxmail.com"},{"name":"ensorrow","email":"1121264060@qq.com"},{"name":"sakuraash","email":"binshao54@gmail.com"},{"name":"erha19","email":"faterrole@gmail.com"},{"name":"lengthmin","email":"lengthmin@gmail.com"}],"homepage":"https://github.com/opensumi/di#readme","bugs":{"url":"https://github.com/opensumi/di/issues"},"dist":{"shasum":"eef97dc1b288b920e68a2244c53a74c56edca344","tarball":"https://registry.npmjs.org/@opensumi/di/-/di-1.9.0.tgz","fileCount":39,"integrity":"sha512-o2iB5Fc/t3eUOw8/XhDD/JXeph6QXzqEbYEICgPkHGD7O/7WcUVDokx8zBNY0tAFdNSNbmqyOTgJf09EjZSgVA==","signatures":[{"sig":"MEUCIQC3dGTcaukY3QOrsx/3O3yUWQ25bjE6z2da18Q187hCwQIgMn2fIaDyWEwPjAprVKpCjACv6w9fIwQJRg4x6DrK53I=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":119285},"jest":{"preset":"ts-jest","testEnvironment":"node","coverageThreshold":{"global":{"lines":10,"branches":10,"functions":10,"statements":10}},"coveragePathIgnorePatterns":["/node_modules/","/test/"]},"main":"dist/index.js","types":"./dist/index.d.ts","engines":{"node":">=8.0.0"},"gitHead":"0471d56c23beec1ad31662a9a6f47f9e1dd3d0e1","scripts":{"ci":"npm run lint && npm run test","lint":"eslint . --ext .js,.jsx,.ts,.tsx","test":"jest --coverage test/**","build":"rm -rf dist && tsc -p tsconfig.prod.json","prepare":"husky install","release":"commit-and-tag-version --npmPublishHint 'echo Just Push code to remote repo, npm publish will be done by CI.'","prerelease":"npm run lint && npm run test && npm run build","test:watch":"yarn test --watch","release:beta":"npm run release -- --prerelease beta"},"_npmUser":{"name":"lengthmin","email":"lengthmin@gmail.com"},"commitlint":{"extends":["@commitlint/config-conventional"]},"repository":{"url":"git+ssh://git@github.com/opensumi/di.git","type":"git"},"_npmVersion":"9.6.7","description":"A dependency injection tool for Javascript.","directories":{},"lint-staged":{"*.ts":["eslint --fix","prettier --write"]},"_nodeVersion":"18.17.1","dependencies":{"reflect-metadata":"^0.1.13"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"jest":"29.2.2","husky":"8.0.1","eslint":"8.27.0","ts-jest":"29.0.3","prettier":"2.7.1","commitlint":"17.2.0","typescript":"4.8.4","@types/jest":"29.2.2","@types/node":"18.11.9","lint-staged":"13.0.3","@commitlint/cli":"17.2.0","commit-and-tag-version":"^11.2.3","eslint-config-prettier":"8.5.0","@typescript-eslint/parser":"5.42.1","@commitlint/config-conventional":"17.2.0","@typescript-eslint/eslint-plugin":"5.42.1"},"standard-version":{"bumpFiles":[{"updater":"./scripts/versionUpdater.js","filename":"./src/constants.ts"},{"type":"json","filename":"package.json"}]},"_npmOperationalInternal":{"tmp":"tmp/di_1.9.0_1697189355349_0.27400783589294253","host":"s3://npm-registry-packages"}},"1.10.0":{"name":"@opensumi/di","version":"1.10.0","keywords":["di","injector"],"license":"MIT","_id":"@opensumi/di@1.10.0","maintainers":[{"name":"yantze","email":"yantze@126.com"},{"name":"ricbet","email":"18676769065@163.com"},{"name":"hacke2","email":"hacke2cn@gmail.com"},{"name":"jinboker","email":"jinboker@foxmail.com"},{"name":"ensorrow","email":"1121264060@qq.com"},{"name":"sakuraash","email":"binshao54@gmail.com"},{"name":"erha19","email":"faterrole@gmail.com"},{"name":"lengthmin","email":"lengthmin@gmail.com"}],"homepage":"https://github.com/opensumi/di#readme","bugs":{"url":"https://github.com/opensumi/di/issues"},"dist":{"shasum":"ddafbe19e98c84a91e3303527c73f283ebd7ba32","tarball":"https://registry.npmjs.org/@opensumi/di/-/di-1.10.0.tgz","fileCount":40,"integrity":"sha512-huOBVwIrIAxXalsCUxsRbVVO3VIMwErBe+pL7X2xQGpBjZ7j2Cq05/nHpRxNkyiLMBQiadGO7vFV6uMz6I2+rQ==","signatures":[{"sig":"MEUCIGjpuNN1nG7pXqEM1PLffXpbMz7cMXO5zcLfkTKtM8ScAiEAkSrOtvT8gsRmBbX7aqUj+BalKnypmdZ19sy6RulJdXg=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":125857},"jest":{"preset":"ts-jest","testEnvironment":"node","coverageThreshold":{"global":{"lines":10,"branches":10,"functions":10,"statements":10}},"coveragePathIgnorePatterns":["/node_modules/","/test/"]},"main":"dist/index.js","engines":{"node":">=8.0.0"},"gitHead":"f586cd58555dab9f8054daa453f6831ab5394667","scripts":{"ci":"npm run lint && npm run test","lint":"eslint . --ext .js,.jsx,.ts,.tsx","test":"jest --coverage test/**","build":"rm -rf dist && tsc -p tsconfig.prod.json","prepare":"husky install","release":"commit-and-tag-version --npmPublishHint 'echo Just Push code to remote repo, npm publish will be done by CI.'","prerelease":"npm run lint && npm run test && npm run build","test:watch":"yarn test --watch","release:beta":"npm run release -- --prerelease beta","prepublishOnly":"npm run build"},"_npmUser":{"name":"lengthmin","email":"lengthmin@gmail.com"},"commitlint":{"extends":["@commitlint/config-conventional"]},"repository":{"url":"git+ssh://git@github.com/opensumi/di.git","type":"git"},"_npmVersion":"6.14.18","description":"A dependency injection tool for Javascript.","directories":{},"lint-staged":{"*.ts":["eslint --fix","prettier --write"]},"_nodeVersion":"14.21.3","dependencies":{"reflect-metadata":"^0.1.13"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"jest":"29.2.2","husky":"8.0.1","eslint":"8.27.0","ts-jest":"29.0.3","prettier":"2.7.1","commitlint":"17.2.0","typescript":"4.8.4","@types/jest":"29.2.2","@types/node":"18.11.9","lint-staged":"13.0.3","@commitlint/cli":"17.2.0","commit-and-tag-version":"^11.2.3","eslint-config-prettier":"8.5.0","@typescript-eslint/parser":"5.42.1","@commitlint/config-conventional":"17.2.0","@typescript-eslint/eslint-plugin":"5.42.1"},"standard-version":{"bumpFiles":[{"updater":"./scripts/versionUpdater.js","filename":"./src/constants.ts"},{"type":"json","filename":"package.json"}]},"_npmOperationalInternal":{"tmp":"tmp/di_1.10.0_1699500603197_0.3188353314059684","host":"s3://npm-registry-packages"}},"1.10.1":{"name":"@opensumi/di","version":"1.10.1","keywords":["di","injector"],"license":"MIT","_id":"@opensumi/di@1.10.1","maintainers":[{"name":"yantze","email":"yantze@126.com"},{"name":"ricbet","email":"18676769065@163.com"},{"name":"hacke2","email":"hacke2cn@gmail.com"},{"name":"jinboker","email":"jinboker@foxmail.com"},{"name":"ensorrow","email":"1121264060@qq.com"},{"name":"sakuraash","email":"binshao54@gmail.com"},{"name":"erha19","email":"faterrole@gmail.com"},{"name":"lengthmin","email":"lengthmin@gmail.com"}],"homepage":"https://github.com/opensumi/di#readme","bugs":{"url":"https://github.com/opensumi/di/issues"},"dist":{"shasum":"e23637989b99de830fcdbca64b9667b68c65737b","tarball":"https://registry.npmjs.org/@opensumi/di/-/di-1.10.1.tgz","fileCount":40,"integrity":"sha512-snIuqlUUmqU7N+jbr3M4GP1j4npmCFX7zZnnSaZNFXhaQplks6AVyMo8aGVeZR4zUQeCXxuXnRzKRTRas0T+hw==","signatures":[{"sig":"MEUCIB8McLXaAXputSUjKp70xSta60oEkC7oWZtIghQuB3RsAiEAnuAIt3YPplTMcCg1NGUI1paRXdq5S3wyF6awEaGwkuQ=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":126139},"jest":{"preset":"ts-jest","testEnvironment":"node","coverageThreshold":{"global":{"lines":10,"branches":10,"functions":10,"statements":10}},"coveragePathIgnorePatterns":["/node_modules/","/test/"]},"main":"dist/index.js","engines":{"node":">=8.0.0"},"gitHead":"e300355b9d29b969195af5f8e47ca074fdabe504","scripts":{"ci":"npm run lint && npm run test","lint":"eslint . --ext .js,.jsx,.ts,.tsx","test":"jest --coverage test/**","build":"rm -rf dist && tsc -p tsconfig.prod.json","prepare":"husky install","release":"commit-and-tag-version --npmPublishHint 'echo Just Push code to remote repo, npm publish will be done by CI.'","prerelease":"npm run lint && npm run test && npm run build","test:watch":"yarn test --watch","release:beta":"npm run release -- --prerelease beta","prepublishOnly":"npm run build"},"_npmUser":{"name":"lengthmin","email":"lengthmin@gmail.com"},"commitlint":{"extends":["@commitlint/config-conventional"]},"repository":{"url":"git+ssh://git@github.com/opensumi/di.git","type":"git"},"_npmVersion":"6.14.18","description":"A dependency injection tool for Javascript.","directories":{},"lint-staged":{"*.ts":["eslint --fix","prettier --write"]},"_nodeVersion":"14.21.3","dependencies":{"reflect-metadata":"^0.1.13"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"jest":"29.2.2","husky":"8.0.1","eslint":"8.27.0","ts-jest":"29.0.3","prettier":"2.7.1","commitlint":"17.2.0","typescript":"4.8.4","@types/jest":"29.2.2","@types/node":"18.11.9","lint-staged":"13.0.3","@commitlint/cli":"17.2.0","commit-and-tag-version":"^11.2.3","eslint-config-prettier":"8.5.0","@typescript-eslint/parser":"5.42.1","@commitlint/config-conventional":"17.2.0","@typescript-eslint/eslint-plugin":"5.42.1"},"standard-version":{"bumpFiles":[{"updater":"./scripts/versionUpdater.js","filename":"./src/constants.ts"},{"type":"json","filename":"package.json"}]},"_npmOperationalInternal":{"tmp":"tmp/di_1.10.1_1702386962562_0.8375149763842871","host":"s3://npm-registry-packages"}},"2.0.0":{"name":"@opensumi/di","version":"2.0.0","keywords":["di","injector"],"license":"MIT","_id":"@opensumi/di@2.0.0","maintainers":[{"name":"yantze","email":"yantze@126.com"},{"name":"ricbet","email":"18676769065@163.com"},{"name":"hacke2","email":"hacke2cn@gmail.com"},{"name":"jinboker","email":"jinboker@foxmail.com"},{"name":"ensorrow","email":"1121264060@qq.com"},{"name":"sakuraash","email":"binshao54@gmail.com"},{"name":"erha19","email":"faterrole@gmail.com"},{"name":"lengthmin","email":"lengthmin@gmail.com"}],"homepage":"https://github.com/opensumi/di#readme","bugs":{"url":"https://github.com/opensumi/di/issues"},"dist":{"shasum":"8478417c523929261ef7f5e26e58914d08864e83","tarball":"https://registry.npmjs.org/@opensumi/di/-/di-2.0.0.tgz","fileCount":5,"integrity":"sha512-SdrNxljEVqm2y4k2H7Ve4sDwBpmS5uRlqGnOfWzPGs2Ijjk/J04/xUEDbURPSAZNUgt4uHXFYlQS5loM8/JEHg==","signatures":[{"sig":"MEYCIQDMQT0To7PsFknuyWtDCn0SlsBwd/EaYFKdn0GdEX22rwIhAM90wbYLdO76EQ3WvSLsTUNkaoqSGr0oLq+S2nZT3hvb","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":21396},"main":"lib/index.js","types":"types/index.d.ts","module":"esm/index.js","engines":{"node":">=8.0.0"},"gitHead":"13fccc72dcbb5b841f8968a6d0766d942c8ce50d","scripts":{"ci":"npm run lint && npm run test","lint":"eslint . --ext .js,.jsx,.ts,.tsx","test":"jest --coverage tests/**","build":"npm run build:lib && npm run build:esm","prepare":"husky install","release":"commit-and-tag-version --npmPublishHint 'echo Just Push code to remote repo, npm publish will be done by CI.'","build:esm":"rm -rf esm && tsc -p tsconfig.esm.json","build:lib":"rm -rf lib && tsc -p tsconfig.lib.json","prerelease":"npm run lint && npm run test && npm run build","test:watch":"yarn test --watch","release:beta":"npm run release -- --prerelease beta","prepublishOnly":"npm run build"},"_npmUser":{"name":"lengthmin","email":"lengthmin@gmail.com"},"commitlint":{"extends":["@commitlint/config-conventional"]},"repository":{"url":"git+ssh://git@github.com/opensumi/di.git","type":"git"},"_npmVersion":"6.14.18","description":"A dependency injection tool for Javascript.","directories":{},"lint-staged":{"*.ts":["eslint --fix","prettier --write"]},"_nodeVersion":"14.21.3","publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"jest":"29.2.2","husky":"8.0.1","eslint":"8.27.0","ts-jest":"29.0.3","prettier":"2.7.1","commitlint":"17.2.0","typescript":"4.8.4","@types/jest":"29.2.2","@types/node":"18.11.9","lint-staged":"13.0.3","@commitlint/cli":"17.2.0","reflect-metadata":"^0.1.13","commit-and-tag-version":"^11.2.3","eslint-config-prettier":"8.5.0","@typescript-eslint/parser":"5.42.1","@commitlint/config-conventional":"17.2.0","@typescript-eslint/eslint-plugin":"5.42.1"},"standard-version":{"bumpFiles":[{"updater":"./scripts/versionUpdater.js","filename":"./src/constants.ts"},{"type":"json","filename":"package.json"}]},"_npmOperationalInternal":{"tmp":"tmp/di_2.0.0_1705649109254_0.47501617304570853","host":"s3://npm-registry-packages"}},"2.1.0":{"name":"@opensumi/di","version":"2.1.0","keywords":["di","injector"],"license":"MIT","_id":"@opensumi/di@2.1.0","maintainers":[{"name":"yantze","email":"yantze@126.com"},{"name":"ricbet","email":"18676769065@163.com"},{"name":"hacke2","email":"hacke2cn@gmail.com"},{"name":"jinboker","email":"jinboker@foxmail.com"},{"name":"ensorrow","email":"1121264060@qq.com"},{"name":"sakuraash","email":"binshao54@gmail.com"},{"name":"erha19","email":"faterrole@gmail.com"},{"name":"lengthmin","email":"lengthmin@gmail.com"}],"homepage":"https://github.com/opensumi/di#readme","bugs":{"url":"https://github.com/opensumi/di/issues"},"dist":{"shasum":"bbe5f3f79c4567ddfe331108d4859399df37c3c0","tarball":"https://registry.npmjs.org/@opensumi/di/-/di-2.1.0.tgz","fileCount":58,"integrity":"sha512-atQ05WSj46NYYI3Ks+JrokOu2zDuelYGW1Ue8WHppWS+yyqrnYlY1tjPmuYCTK7Fo6pRN/Lf5PikthscHEINOA==","signatures":[{"sig":"MEUCIBzlxcYku2PHZqcY8LaNEBBFW67AOGgP3SotovSxsdLcAiEA2w5j78xckGQ0624JVu7LNrjc+paeANLvtJl/Z8h7+RI=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":153404},"main":"lib/index.js","types":"types/index.d.ts","module":"esm/index.js","engines":{"node":">=8.0.0"},"gitHead":"329dfcd3b4c17e7defb50bf16ecfbb1c184367a3","scripts":{"ci":"npm run lint && npm run test","lint":"eslint . --ext .js,.jsx,.ts,.tsx","test":"jest --coverage tests/**","build":"npm run build:lib && npm run build:esm","prepare":"husky install","release":"commit-and-tag-version --npmPublishHint 'echo Just Push code to remote repo, npm publish will be done by CI.'","build:esm":"rm -rf esm && tsc -p tsconfig.esm.json","build:lib":"rm -rf lib && tsc -p tsconfig.lib.json","prerelease":"npm run lint && npm run test && npm run build","test:watch":"yarn test --watch","release:beta":"npm run release -- --prerelease beta","prepublishOnly":"npm run build"},"_npmUser":{"name":"lengthmin","email":"lengthmin@gmail.com"},"commitlint":{"extends":["@commitlint/config-conventional"]},"repository":{"url":"git+ssh://git@github.com/opensumi/di.git","type":"git"},"_npmVersion":"6.14.18","description":"A dependency injection tool for Javascript.","directories":{},"lint-staged":{"*.ts":["eslint --fix","prettier --write"]},"_nodeVersion":"14.21.3","publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"jest":"29.2.2","husky":"8.0.1","eslint":"8.27.0","ts-jest":"29.0.3","prettier":"2.7.1","commitlint":"17.2.0","typescript":"4.8.4","@types/jest":"29.2.2","@types/node":"18.11.9","lint-staged":"13.0.3","@commitlint/cli":"17.2.0","reflect-metadata":"^0.1.13","commit-and-tag-version":"^11.2.3","eslint-config-prettier":"8.5.0","@typescript-eslint/parser":"5.42.1","@commitlint/config-conventional":"17.2.0","@typescript-eslint/eslint-plugin":"5.42.1"},"standard-version":{"bumpFiles":[{"updater":"./scripts/versionUpdater.js","filename":"./src/constants.ts"},{"type":"json","filename":"package.json"}]},"_npmOperationalInternal":{"tmp":"tmp/di_2.1.0_1705897814612_0.6464244776767423","host":"s3://npm-registry-packages"}}},"time":{"created":"2021-11-24T15:41:15.614Z","modified":"2026-05-07T08:55:24.395Z","1.0.0":"2021-11-24T15:41:15.922Z","1.0.1":"2021-12-14T02:58:28.002Z","1.1.0-beta.0":"2021-12-14T05:32:17.977Z","1.1.0":"2021-12-14T05:55:09.682Z","1.3.0":"2022-05-05T12:09:19.201Z","1.3.1":"2022-05-06T09:50:40.761Z","1.4.0-beta.0":"2022-05-24T13:36:42.210Z","1.4.0-beta.1":"2022-05-30T14:16:40.501Z","1.4.0-beta.2":"2022-05-30T15:11:47.431Z","1.4.0":"2022-06-09T03:02:32.098Z","1.5.0":"2022-06-20T07:59:55.319Z","1.6.0-beta.0":"2022-07-15T09:32:38.304Z","1.6.0":"2022-07-15T09:41:55.766Z","1.7.0":"2022-07-17T06:29:01.493Z","1.8.0":"2022-08-10T07:59:07.019Z","1.8.0-reflection.0":"2023-08-02T08:37:50.619Z","1.8.1":"2023-09-26T07:20:09.465Z","1.9.0":"2023-10-13T09:29:15.640Z","1.10.0":"2023-11-09T03:30:03.401Z","1.10.1":"2023-12-12T13:16:02.839Z","2.0.0":"2024-01-19T07:25:09.421Z","2.1.0":"2024-01-22T04:30:14.759Z"},"bugs":{"url":"https://github.com/opensumi/di/issues"},"license":"MIT","homepage":"https://github.com/opensumi/di#readme","keywords":["di","injector"],"repository":{"url":"git+ssh://git@github.com/opensumi/di.git","type":"git"},"description":"A dependency injection tool for Javascript.","maintainers":[{"email":"1121264060@qq.com","name":"ensorrow"},{"email":"jinboker@foxmail.com","name":"jinboker"},{"email":"18676769065@163.com","name":"ricbet"},{"email":"hacke2cn@gmail.com","name":"hacke2"},{"email":"lengthmin@gmail.com","name":"lengthmin"},{"email":"faterrole@gmail.com","name":"erha19"},{"email":"binshao54@gmail.com","name":"sakuraash"},{"email":"yantze@126.com","name":"yantze"},{"email":"lujavascript@gmail.com","name":"lujs"},{"email":"coffeedeveloper@gmail.com","name":"coffeedeveloper"}],"readme":"# @opensumi/di\n\n[中文文档](./README-zh_CN.md)\n\n[![CI](https://github.com/opensumi/di/actions/workflows/ci.yml/badge.svg)](https://github.com/opensumi/di/actions/workflows/ci.yml) [![NPM Version][npm-image]][npm-url] [![NPM downloads][download-image]][download-url] [![Test Coverage][test-image]][test-url] [![License][license-image]][license-url] [![Bundle size for @opensumi/di][pkg-size-img]][pkg-size]\n\n[npm-image]: https://img.shields.io/npm/v/@opensumi/di.svg\n[npm-url]: https://www.npmjs.com/package/@opensumi/di\n[download-image]: https://img.shields.io/npm/dm/@opensumi/di.svg\n[download-url]: https://npmjs.org/package/@opensumi/di\n[license-image]: https://img.shields.io/npm/l/@opensumi/di.svg\n[license-url]: https://github.com/opensumi/di/blob/main/LICENSE\n[test-image]: https://codecov.io/gh/opensumi/di/branch/main/graph/badge.svg?token=07JAPLU957\n[test-url]: https://codecov.io/gh/opensumi/di\n[pkg-size]: https://pkg-size.dev/@opensumi/di\n[pkg-size-img]: https://pkg-size.dev/badge/bundle/43685\n\n> Inspired By [Angular](https://angular.io/guide/dependency-injection).\n\nThis tool will help you achieve dependency inversion effectively without concerning the details of object instantiation. Additionally, since object instantiation is done within a registry, both the factory pattern and singleton pattern can be easily implemented.\n\n## Table of Contents\n\n- [Install](#install)\n- [Quick Start](#quick-start)\n- [API](#api)\n- [Examples](#examples)\n- [FAQ](#faq)\n- [Related Efforts](#related-efforts)\n\n## Installation\n\n```sh\nnpm install @opensumi/di --save\nyarn add @opensumi/di\n```\n\nModify your tsconfig.json to include the following settings:\n\n```json\n{\n  \"compilerOptions\": {\n    \"experimentalDecorators\": true,\n    \"emitDecoratorMetadata\": true\n  }\n}\n```\n\nAdd a polyfill for the Reflect API (examples below use reflect-metadata). You can use:\n\n- [reflect-metadata](https://www.npmjs.com/package/reflect-metadata)\n- [core-js (core-js/es7/reflect)](https://www.npmjs.com/package/core-js)\n- [reflection](https://www.npmjs.com/package/@abraham/reflection)\n\nThe Reflect polyfill import should only be added once, and before DI is used:\n\n```typescript\n// main.ts\nimport \"reflect-metadata\";\n\n// Your code here...\n```\n\n## Quick Start\n\nLet's start with a simple example:\n\n```ts\nimport { Injector } from '@opensumi/di';\n\n// we create a new Injector instance\nconst injector = new Injector();\n\nconst TokenA = Symbol('TokenA');\ninjector.addProviders({\n  token: TokenA,\n  useValue: 1,\n});\ninjector.get(TokenA) === 1; // true\n```\n\nThe `Injector` class is the starting point of all things. We create a `injector`, and we add a provider into it:\n\n```ts\ninjector.addProviders({\n  token: TokenA,\n  useValue: 1,\n});\n```\n\nWe use a `ValueProvider` here, and its role is to provide a value:\n\n```ts\ninterface ValueProvider {\n  token: Token;\n  useValue: any;\n}\n```\n\nWe have the following several kinds of the provider. According to the different Provider kinds, Injector will use different logic to provide the value that you need.\n\n```ts\ntype Provider = ClassProvider | ValueProvider | FactoryProvider | AliasProvider;\n```\n\nA token is used to find the real value in the Injector, so token should be a global unique value.\n\n```ts\ntype Token = string | symbol | Function;\n```\n\nand now we want get value from the `Injector`, just use `Injector.get`:\n\n```ts\ninjector.get(TokenA) === 1;\n```\n\n### Providers\n\nHere are all the providers we have:\n\n#### ClassProvider\n\nDeclare a provider that includes a constructor and its token.\n\n```ts\ninterface ClassProvider {\n  token: Token;\n  useClass: ConstructorOf<any>;\n}\n```\n\nAfter dependency inversion, constructors depending on abstractions instead of instances can be highly effective. For example, consider the following example:\n\n```ts\ninterface Drivable {\n  drive(): void;\n}\n\n@Injectable()\nclass Student {\n  @Autowired('Drivable')\n  mBike: Drivable;\n\n  goToSchool() {\n    console.log('go to school');\n    this.mBike.drive();\n  }\n}\n```\n\nThe student object depends on a drivable mode of transportation, which can be provided either as a bicycle or a car during object creation:\n\n```ts\n@Injectable()\nclass Car implements Drivable {\n  drive() {\n    console.log('by car');\n  }\n}\n\ninjector.addProviders(Student, {\n  token: 'Drivable',\n  useClass: Car,\n});\n\nconst student = injector.get(Student);\nstudent.goToSchool(); // print 'go to school by car'\n```\n\n#### ValueProvider\n\nThis provider is used to provide a value:\n\n```ts\ninterface ValueProvider {\n  token: Token;\n  useValue: any;\n}\n```\n\n```ts\nconst TokenA = Symbol('TokenA');\ninjector.addProviders({\n  token: TokenA,\n  useValue: 1,\n});\ninjector.get(TokenA) === 1; // true\n```\n\n#### FactoryProvider\n\nDeclare a provider, and later you can use this token to invoke this factory function.\n\n```ts\ninterface FactoryFunction<T = any> {\n  (injector: Injector): T;\n}\ninterface FactoryProvider {\n  token: Token;\n  useFactory: FactoryFunction<T>;\n}\n```\n\nIt also provides some helper functions for the factory pattern:\n\n1. `asSingleton`\n\nYou can implement a singleton factory by using this helper:\n\n```ts\nconst provider = {\n  token,\n  useFactory: asSingleton(() => new A()),\n};\n```\n\n#### AliasProvider\n\nSets a token to the alias of an existing token.\n\n```ts\ninterface AliasProvider {\n  // New Token\n  token: Token;\n  // Existing Token\n  useAlias: Token;\n}\n```\n\nand then you can use:\n\n```ts\nconst TokenA = Symbol('TokenA');\nconst TokenB = Symbol('TokenB');\ninjector.addProviders(\n  {\n    token: TokenA,\n    useValue: 1,\n  },\n  {\n    token: TokenB,\n    useAlias: TokenA,\n  },\n);\ninjector.get(TokenA) === 1; // true\ninjector.get(TokenB) === 1; // true\n```\n\n### Perform constructor injection\n\nIn this example, you can see the `class B` depends on `class A`,And declare this dependency relationship in the parameter list of the constructor.:\n\nSo, during the instantiation process of `class B`, the Injector will automatically create the `A` instance and inject it into the `B` instance.\n\n```ts\n@Injectable()\nclass A {\n  constructor() {\n    console.log('Create A');\n  }\n}\n\n@Injectable()\nclass B {\n  constructor(public a: A) {}\n}\n\nconst injector = new Injector();\ninjector.addProviders(A, B);\n\nconst b = injector.get(B); // print 'Create A'\nconsole.log(b.a instanceof A); // print 'true'\n```\n\n### Use `@Autowired` for dynamic injection\n\n```ts\n@Injectable()\nclass A {\n  constructor() {\n    console.log('Create A');\n  }\n}\n\n@Injectable()\nclass B {\n  @Autowired()\n  a: A;\n}\n\nconst injector = new Injector();\ninjector.addProviders(A, B);\n\nconst b = injector.get(B);\nconsole.log(b.a instanceof A); // print 'Create A'; print 'true'\n```\n\n### Use Singleton pattern Or Multiton pattern\n\n```ts\n@Injectable()\nclass Singleton {\n  constructor() {}\n}\n\n@Injectable({ multiple: true })\nclass Multiton {\n  constructor() {}\n}\n\nconst injector = new Injector();\ninjector.addProviders(Singleton, Multiton);\n\nconst single1 = injector.get(Singleton);\nconst single2 = injector.get(Singleton);\nconsole.log(single1 === single2); // print 'true'\n\nconst multiple1 = injector.get(Multiton);\nconst multiple2 = injector.get(Multiton);\nconsole.log(multiple1 === multiple2); // print 'false'\n```\n\n### Depend on abstractions rather than implementations\n\n```ts\nconst LOGGER_TOKEN = Symbol('LOGGER_TOKEN');\n\ninterface Logger {\n  log(msg: string): void;\n}\n\n@Injectable()\nclass App {\n  @Autowired(LOGGER_TOKEN)\n  logger: Logger;\n}\n\n@Injectable()\nclass LoggerImpl implements Logger {\n  log(msg: string) {\n    console.log(msg);\n  }\n}\n\nconst injector = new Injector();\ninjector.addProviders(App);\ninjector.addProviders({\n  token: LOGGER_TOKEN,\n  useClass: LoggerImpl,\n});\n\nconst app = injector.get(App);\nconsole.log(app.logger instanceof LoggerImpl); // print 'true'\n```\n\n### Use an abstract class as a Token\n\n```ts\nabstract class Logger {\n  abstract log(msg: string): void;\n}\n\n@Injectable()\nclass LoggerImpl implements Logger {\n  log(msg: string) {\n    console.log(msg);\n  }\n}\n\n@Injectable()\nclass App {\n  @Autowired()\n  logger: Logger;\n}\n\nconst injector = new Injector();\ninjector.addProviders(App);\ninjector.addProviders({\n  token: Logger,\n  useClass: LoggerImpl,\n});\n\nconst app = injector.get(App);\nconsole.log(app.logger instanceof LoggerImpl); // print 'true'\n```\n\n## API\n\n### decorator: @Injectable\n\n```ts\ninterface InstanceOpts {\n  multiple?: boolean;\n}\nfunction Injectable(opts?: InstanceOpts): ClassDecorator;\n\n@Injectable({ multiple: true })\nclass A {}\n\nconst injector = new Injector([A]);\n\nconst a = injector.get(A);\nconsole.log(injector.hasInstance(a)); // print 'false'\n```\n\nAll constructor functions that need to be created by the Injector must be decorated with this decorator in order to work properly. Otherwise, an error will be thrown.\n\n- multiple: Whether to enable the multiple instance mode or not, once the multiple instance mode is enabled, the Injector will not hold references to instance objects.\n\n### decorator: @Autowired\n\n```ts\nfunction Autowired(token?: Token): PropertyDecorator;\n\n@Injectable()\nclass A {}\n\n@Injectable()\nclass B {\n  @Autowired()\n  a: A;\n}\n```\n\nDecorating a property will allow the registry to dynamically create a dependency instance, which will only be created when it is accessed. For example, in the given example, the instance of class A will be created only when `b.a` is accessed.\n\n> It's important to note that since `Autowired` depends on an instance of the `Injector`, only objects created by the `Injector` can use this decorator.\n\n### decorator: @Inject\n\n```ts\nfunction Inject(token: string | symbol): ParameterDecorator;\n\ninterface IA {\n  log(): void;\n}\n\n@Injectable()\nclass B {\n  constructor(@Inject('IA') a: IA) {}\n}\n```\n\nWhen performing dependency injection in a constructor parameter, it is necessary to specify the decorator for the dependency token when a constructor depends on an abstraction that is passed into the constructor. In such cases, you will need to use this decorator.\n\n### Injector.get\n\n```ts\ninterface Injector<T extends Token> {\n  get(token: ConstructorOf<any>, args?: ConstructorParameters<T>, opts?: InstanceOpts): TokenResult<T>;\n  get(token: T, opts?: InstanceOpts): TokenResult<T>;\n}\n```\n\nYou can use this method to create an instance of a specific token from the `Injector`.\n\nif you pass a constructor as the first parameter and provide constructor arguments as the second parameter (if any), the Injector will directly create an instance of the constructor and apply dependency injection. In this case, the constructor does not need to be decorated with Injectable and can still create objects successfully. For example:\n\n```ts\n@Injectable()\nclass A {}\n\nclass B {\n  @Autowired()\n  a: A;\n}\n\nconst injector = new Injector([A]);\nconst b = injector.get(B, []);\nconsole.log(b.a instanceof A); // print 'true'\n```\n\n### Injector.hasInstance\n\nWhether have an instantiated object in the Injector.\n\n### markInjectable\n\n```ts\nimport { markInjectable } from '@opensumi/di';\nimport { Editor } from 'path/to/package';\n\nmarkInjectable(Editor);\n```\n\nYou can use this function to mark some Class as Injectable.\n\n## Examples\n\nSee More Examples [in the test case](test/use-case.test.ts).\n\n## FAQ\n\nPlease see [FAQ.md](docs/faq.md).\n\n## Related Efforts\n\n- [Angular](https://angular.io/guide/dependency-injection) Dependency injection in Angular\n- [injection-js](https://github.com/mgechev/injection-js) It is an extraction of the Angular's ReflectiveInjector.\n- [InversifyJS](https://github.com/inversify/InversifyJS) A powerful and lightweight inversion of control container for JavaScript & Node.js apps powered by TypeScript.\n- [power-di](https://github.com/zhang740/power-di) A lightweight Dependency Injection library.\n","readmeFilename":"README.md"}