{"_id":"@atlex/core","_rev":"16-f5cc2fb85d90839d838693080efded0e","name":"@atlex/core","dist-tags":{"latest":"0.2.2"},"versions":{"0.1.1":{"name":"@atlex/core","version":"0.1.1","keywords":["atlex","framework","typescript","nodejs","routing","di"],"author":{"url":"https://github.com/khamazaspyan","name":"Karen Hamazaspyan"},"license":"MIT","_id":"@atlex/core@0.1.1","maintainers":[{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"}],"homepage":"https://atlex.dev","bugs":{"url":"https://github.com/atlex-framework/atlex-monorepo/issues"},"dist":{"shasum":"1d3382af9f7a69407f016e1b86ce0c39d638e5af","tarball":"https://registry.npmjs.org/@atlex/core/-/core-0.1.1.tgz","fileCount":283,"integrity":"sha512-MwC/3Kfzvpmx015XX59N/6Z672gbye7JTt5bUZqenfRLBJ2qbMattgiv6rh3JpBu3QHPNwzX308JFyxVgJDwFQ==","signatures":[{"sig":"MEQCIFCPYQNTHkpEqiiSv321kocJ5gOejXH77AXcUBo4MNKoAiB7iA9XYwHYWqFmhFpA7qPGmF/2Q5xnpzU57sZgyU9nqg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":313042},"main":"./dist/index.js","type":"module","_from":"file:atlex-core-0.1.1.tgz","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./events/testing":{"types":"./dist/events/testing/EventFake.d.ts","default":"./dist/events/testing/EventFake.js"}},"scripts":{"test":"vitest run -c vitest.config.ts","build":"tsc -p tsconfig.json","typecheck":"tsc --noEmit -p tsconfig.json"},"_npmUser":{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"},"_resolved":"/tmp/bd088d25b43f8a89b825466fb616b8fb/atlex-core-0.1.1.tgz","_integrity":"sha512-MwC/3Kfzvpmx015XX59N/6Z672gbye7JTt5bUZqenfRLBJ2qbMattgiv6rh3JpBu3QHPNwzX308JFyxVgJDwFQ==","repository":{"url":"git+https://github.com/atlex-framework/atlex-monorepo.git","type":"git","directory":"packages/core"},"_npmVersion":"10.9.7","description":"IoC container, routing, middleware, events, and HTTP foundation for Atlex","directories":{},"_nodeVersion":"22.22.2","dependencies":{"cors":"^2.8.5","helmet":"^8.1.0","express":"^5.1.0","socket.io":"^4.8.3","reflect-metadata":"^0.2.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.4","@swc/core":"^1.15.24","@types/cors":"^2.8.19","unplugin-swc":"^1.5.9","@types/express":"^5.0.3"},"_npmOperationalInternal":{"tmp":"tmp/core_0.1.1_1776194469025_0.00039872410328456453","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@atlex/core","version":"0.1.2","keywords":["atlex","framework","typescript","nodejs","routing","di"],"author":{"url":"https://github.com/khamazaspyan","name":"Karen Hamazaspyan"},"license":"MIT","_id":"@atlex/core@0.1.2","maintainers":[{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"}],"homepage":"https://atlex.dev","bugs":{"url":"https://github.com/atlex-framework/core/issues"},"dist":{"shasum":"a7871dc523b1e6f27cb7d0aeb4a5e6c42f4482b5","tarball":"https://registry.npmjs.org/@atlex/core/-/core-0.1.2.tgz","fileCount":283,"integrity":"sha512-p5Bo8KKb1vnuE+I5QNC6YkCJPuGb5YtHZ9gVgXgXw2WmxjRnC9dAiBNV2zyiTc1hgNs+QD0AHaQSq0spxfHy+w==","signatures":[{"sig":"MEQCID7wKLPQkv+aV6P5r5xUjWurdCyV+tojC3qFgh89OcMpAiBV5UZmUzSzyuByaO9lypeN/DGtMCNaP/b7BiKpgXrH1Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":313022},"main":"./dist/index.js","type":"module","_from":"file:atlex-core-0.1.2.tgz","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./events/testing":{"types":"./dist/events/testing/EventFake.d.ts","default":"./dist/events/testing/EventFake.js"}},"scripts":{"test":"vitest run -c vitest.config.ts","build":"tsc -p tsconfig.json","typecheck":"tsc --noEmit -p tsconfig.json"},"_npmUser":{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"},"_resolved":"/tmp/43e650641627db9dd0a98c742ccde690/atlex-core-0.1.2.tgz","_integrity":"sha512-p5Bo8KKb1vnuE+I5QNC6YkCJPuGb5YtHZ9gVgXgXw2WmxjRnC9dAiBNV2zyiTc1hgNs+QD0AHaQSq0spxfHy+w==","repository":{"url":"git+https://github.com/atlex-framework/core.git","type":"git","directory":"packages/core"},"_npmVersion":"10.9.7","description":"IoC container, routing, middleware, events, and HTTP foundation for Atlex","directories":{},"_nodeVersion":"22.22.2","dependencies":{"cors":"^2.8.5","helmet":"^8.1.0","express":"^5.1.0","socket.io":"^4.8.3","reflect-metadata":"^0.2.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.4","@swc/core":"^1.15.24","@types/cors":"^2.8.19","unplugin-swc":"^1.5.9","@types/express":"^5.0.3"},"_npmOperationalInternal":{"tmp":"tmp/core_0.1.2_1776235380488_0.3040198091986004","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@atlex/core","version":"0.1.3","keywords":["atlex","framework","typescript","nodejs","routing","di"],"author":{"url":"https://github.com/khamazaspyan","name":"Karen Hamazaspyan"},"license":"MIT","_id":"@atlex/core@0.1.3","maintainers":[{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"}],"homepage":"https://atlex.dev","bugs":{"url":"https://github.com/atlex-framework/core/issues"},"dist":{"shasum":"49a63a2f1408783f9f0ab3afaf169123209cc1be","tarball":"https://registry.npmjs.org/@atlex/core/-/core-0.1.3.tgz","fileCount":283,"integrity":"sha512-ByWmRFCERXPNGIyLjhlW8jtHaBmiQ8TfBDBlOeSTxSjxqjRWjzwsaB8HwvEcKu17WCMaNYXFi1+3Lk6orHQ7QQ==","signatures":[{"sig":"MEYCIQC+DpOGYOsXaC9P9CHerbwn709WhjbbengKHxeLY2fAmQIhAO9cU4nQazXjGXZBVhpiWSQ3QvtmyZQYWR3+LdeMFWQF","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":313022},"main":"./dist/index.js","type":"module","_from":"file:atlex-core-0.1.3.tgz","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./events/testing":{"types":"./dist/events/testing/EventFake.d.ts","default":"./dist/events/testing/EventFake.js"}},"scripts":{"test":"vitest run -c vitest.config.ts","build":"tsc -p tsconfig.json","typecheck":"tsc --noEmit -p tsconfig.json"},"_npmUser":{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"},"_resolved":"/tmp/f187ecb6c2d7a69f2e44e7e7e75791a4/atlex-core-0.1.3.tgz","_integrity":"sha512-ByWmRFCERXPNGIyLjhlW8jtHaBmiQ8TfBDBlOeSTxSjxqjRWjzwsaB8HwvEcKu17WCMaNYXFi1+3Lk6orHQ7QQ==","repository":{"url":"git+https://github.com/atlex-framework/core.git","type":"git","directory":"packages/core"},"_npmVersion":"10.9.7","description":"IoC container, routing, middleware, events, and HTTP foundation for Atlex","directories":{},"_nodeVersion":"22.22.2","dependencies":{"cors":"^2.8.5","helmet":"^8.1.0","express":"^5.1.0","socket.io":"^4.8.3","reflect-metadata":"^0.2.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.4","@swc/core":"^1.15.24","@types/cors":"^2.8.19","unplugin-swc":"^1.5.9","@types/express":"^5.0.3"},"_npmOperationalInternal":{"tmp":"tmp/core_0.1.3_1776256068674_0.994666955245066","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"@atlex/core","version":"0.1.4","keywords":["atlex","nodejs","framework","backend-framework","web-framework","mvc","mvc-framework","http-framework","rest-api","rest-framework","ioc-container","dependency-injection","di-container","service-provider","routing","router","http-router","middleware","controller","decorator","decorators","reflect-metadata","laravel-alternative","laravel-for-nodejs","laravel-nodejs","express-framework","express-alternative","nestjs-alternative","javascript","typescript"],"author":{"url":"https://github.com/khamazaspyan","name":"Karen Hamazaspyan"},"license":"MIT","_id":"@atlex/core@0.1.4","maintainers":[{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"}],"homepage":"https://atlex.dev","bugs":{"url":"https://github.com/atlex-framework/core/issues"},"dist":{"shasum":"cf690a3d86edad0d4ad7e83194521a68c2f3250b","tarball":"https://registry.npmjs.org/@atlex/core/-/core-0.1.4.tgz","fileCount":283,"integrity":"sha512-yzYYdlOaCBCmmwzzVhxX6qFqmjdBbOcy+y51TqKkEY1QUS+VVcxCCZqmn7x+P8yZlR+tTcQhrRd9U1OLUKBnYA==","signatures":[{"sig":"MEUCIQDOvzXta/I4feLukoqgJfY68RTqXyZxuHRdvOlLko8GmgIgaimC3lM9jozWjAIF+NYrzX20E6LFTJmMCPvh+PmSjPw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":313614},"main":"./dist/index.js","type":"module","_from":"file:atlex-core-0.1.4.tgz","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./events/testing":{"types":"./dist/events/testing/EventFake.d.ts","default":"./dist/events/testing/EventFake.js"}},"scripts":{"test":"vitest run -c vitest.config.ts","build":"tsc -p tsconfig.json","typecheck":"tsc --noEmit -p tsconfig.json"},"_npmUser":{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"},"_resolved":"/tmp/2c08f51dbe815cc5476ad29ab624c43a/atlex-core-0.1.4.tgz","_integrity":"sha512-yzYYdlOaCBCmmwzzVhxX6qFqmjdBbOcy+y51TqKkEY1QUS+VVcxCCZqmn7x+P8yZlR+tTcQhrRd9U1OLUKBnYA==","repository":{"url":"git+https://github.com/atlex-framework/core.git","type":"git","directory":"packages/core"},"_npmVersion":"10.9.7","description":"IoC container, routing, middleware, events, and HTTP foundation for Atlex","directories":{},"_nodeVersion":"22.22.2","dependencies":{"cors":"^2.8.5","helmet":"^8.1.0","express":"^5.1.0","socket.io":"^4.8.3","reflect-metadata":"^0.2.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.4","@swc/core":"^1.15.24","@types/cors":"^2.8.19","unplugin-swc":"^1.5.9","@types/express":"^5.0.3"},"_npmOperationalInternal":{"tmp":"tmp/core_0.1.4_1776259437036_0.25579979248232876","host":"s3://npm-registry-packages-npm-production"}},"0.1.5":{"name":"@atlex/core","version":"0.1.5","keywords":["atlex","nodejs","framework","backend-framework","web-framework","mvc","mvc-framework","http-framework","rest-api","rest-framework","ioc-container","dependency-injection","di-container","service-provider","routing","router","http-router","middleware","controller","decorator","decorators","reflect-metadata","laravel-alternative","laravel-for-nodejs","laravel-nodejs","express-framework","express-alternative","nestjs-alternative","javascript","typescript"],"author":{"url":"https://github.com/khamazaspyan","name":"Karen Hamazaspyan"},"license":"MIT","_id":"@atlex/core@0.1.5","maintainers":[{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"}],"homepage":"https://atlex.dev","bugs":{"url":"https://github.com/atlex-framework/core/issues"},"dist":{"shasum":"6b399e15fc8769cfae413925e87be6184887d3db","tarball":"https://registry.npmjs.org/@atlex/core/-/core-0.1.5.tgz","fileCount":283,"integrity":"sha512-kdSOoycrLZohJ4YdGvJ+jl3UKSBUVilD8IZhBTLI7kPyXAfJUXm3MDVQvf9pd15FcU2qj/UaG8trT6iYpssa7g==","signatures":[{"sig":"MEQCIEUVqZwi6e4lIEsb39ztqFP3rnAQwodpZb/U7GzBpSVrAiB4mDdjT67mKbIgE3x2+AHaymjrgMgjuk/erBFenSvJUA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":313614},"main":"./dist/index.js","type":"module","_from":"file:atlex-core-0.1.5.tgz","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./events/testing":{"types":"./dist/events/testing/EventFake.d.ts","default":"./dist/events/testing/EventFake.js"}},"scripts":{"test":"vitest run -c vitest.config.ts","build":"tsc -p tsconfig.json","typecheck":"tsc --noEmit -p tsconfig.json"},"_npmUser":{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"},"_resolved":"/tmp/632e03c4e546c8193aba71b585048a70/atlex-core-0.1.5.tgz","_integrity":"sha512-kdSOoycrLZohJ4YdGvJ+jl3UKSBUVilD8IZhBTLI7kPyXAfJUXm3MDVQvf9pd15FcU2qj/UaG8trT6iYpssa7g==","repository":{"url":"git+https://github.com/atlex-framework/core.git","type":"git","directory":"packages/core"},"_npmVersion":"10.9.7","description":"IoC container, routing, middleware, events, and HTTP foundation for Atlex","directories":{},"_nodeVersion":"22.22.2","dependencies":{"cors":"^2.8.5","helmet":"^8.1.0","express":"^5.1.0","socket.io":"^4.8.3","reflect-metadata":"^0.2.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.4","@swc/core":"^1.15.24","@types/cors":"^2.8.19","unplugin-swc":"^1.5.9","@types/express":"^5.0.3"},"_npmOperationalInternal":{"tmp":"tmp/core_0.1.5_1776260707300_0.3975373023319537","host":"s3://npm-registry-packages-npm-production"}},"0.1.6":{"name":"@atlex/core","version":"0.1.6","keywords":["atlex","nodejs","framework","backend-framework","web-framework","mvc","mvc-framework","http-framework","rest-api","rest-framework","ioc-container","dependency-injection","di-container","service-provider","routing","router","http-router","middleware","controller","decorator","decorators","reflect-metadata","laravel-alternative","laravel-for-nodejs","laravel-nodejs","express-framework","express-alternative","nestjs-alternative","javascript","typescript"],"author":{"url":"https://github.com/khamazaspyan","name":"Karen Hamazaspyan"},"license":"MIT","_id":"@atlex/core@0.1.6","maintainers":[{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"}],"homepage":"https://atlex.dev","bugs":{"url":"https://github.com/atlex-framework/core/issues"},"dist":{"shasum":"48fe38d782458f6ad11f70429503e8786626318b","tarball":"https://registry.npmjs.org/@atlex/core/-/core-0.1.6.tgz","fileCount":283,"integrity":"sha512-wpTXYMbQv5D/Wzl0FbHAusSeHufa7m0tdpuUBUS1ie3kBM4vJsyrXkU9X+0T1qnoADUt5S9Sp/owYGAxwfXgJA==","signatures":[{"sig":"MEUCIQCr5dluplGdqZXIetiD39SS+X8eS0rj3HTVPn7lDlzG3gIgPFSyDvWg29mA08mVWa/QoA2spd5g6oqaVABAA5dvu6A=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":313614},"main":"./dist/index.js","type":"module","_from":"file:atlex-core-0.1.6.tgz","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./events/testing":{"types":"./dist/events/testing/EventFake.d.ts","default":"./dist/events/testing/EventFake.js"}},"scripts":{"test":"vitest run -c vitest.config.ts","build":"tsc -p tsconfig.json","typecheck":"tsc --noEmit -p tsconfig.json"},"_npmUser":{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"},"_resolved":"/tmp/0bed642539e72a2bc048e1508875b1fe/atlex-core-0.1.6.tgz","_integrity":"sha512-wpTXYMbQv5D/Wzl0FbHAusSeHufa7m0tdpuUBUS1ie3kBM4vJsyrXkU9X+0T1qnoADUt5S9Sp/owYGAxwfXgJA==","repository":{"url":"git+https://github.com/atlex-framework/core.git","type":"git","directory":"packages/core"},"_npmVersion":"10.9.7","description":"IoC container, routing, middleware, events, and HTTP foundation for Atlex","directories":{},"_nodeVersion":"22.22.2","dependencies":{"cors":"^2.8.5","helmet":"^8.1.0","express":"^5.1.0","socket.io":"^4.8.3","reflect-metadata":"^0.2.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.4","@swc/core":"^1.15.24","@types/cors":"^2.8.19","unplugin-swc":"^1.5.9","@types/express":"^5.0.3"},"_npmOperationalInternal":{"tmp":"tmp/core_0.1.6_1778694344957_0.7844554758998845","host":"s3://npm-registry-packages-npm-production"}},"0.1.7":{"name":"@atlex/core","version":"0.1.7","keywords":["atlex","nodejs","framework","backend-framework","web-framework","mvc","mvc-framework","http-framework","rest-api","rest-framework","ioc-container","dependency-injection","di-container","service-provider","routing","router","http-router","middleware","controller","decorator","decorators","reflect-metadata","laravel-alternative","laravel-for-nodejs","laravel-nodejs","express-framework","express-alternative","nestjs-alternative","javascript","typescript"],"author":{"url":"https://github.com/khamazaspyan","name":"Karen Hamazaspyan"},"license":"MIT","_id":"@atlex/core@0.1.7","maintainers":[{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"}],"homepage":"https://atlex.dev","bugs":{"url":"https://github.com/atlex-framework/core/issues"},"dist":{"shasum":"0ca3e59ad428587dc6331aaeb26d9ec6fb00249b","tarball":"https://registry.npmjs.org/@atlex/core/-/core-0.1.7.tgz","fileCount":299,"integrity":"sha512-1XJx3wUeSwd36bpV/XazbBTrdJzBtUUe6fSlyUKskROH4EGSBbfJGeAA7+N0K7Q89G8xdE90ycLdfaqCyvtxEA==","signatures":[{"sig":"MEUCIHoSfQYTRzDAZsuyO8U+MbR+v5gBDJcfSYJunqYMDpUKAiEAxMix2AmA5uZQp101YvviSoc00jW5TkQddi0wwMGszEQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":339038},"main":"./dist/index.js","type":"module","_from":"file:atlex-core-0.1.7.tgz","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./events/testing":{"types":"./dist/events/testing/EventFake.d.ts","default":"./dist/events/testing/EventFake.js"}},"scripts":{"test":"vitest run -c vitest.config.ts","build":"tsc -p tsconfig.json","typecheck":"tsc --noEmit -p tsconfig.json"},"_npmUser":{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"},"_resolved":"/tmp/bbbb42574f33421444e394d85eca2c59/atlex-core-0.1.7.tgz","_integrity":"sha512-1XJx3wUeSwd36bpV/XazbBTrdJzBtUUe6fSlyUKskROH4EGSBbfJGeAA7+N0K7Q89G8xdE90ycLdfaqCyvtxEA==","repository":{"url":"git+https://github.com/atlex-framework/core.git","type":"git","directory":"packages/core"},"_npmVersion":"10.9.7","description":"IoC container, routing, middleware, events, and HTTP foundation for Atlex","directories":{},"_nodeVersion":"22.22.2","dependencies":{"ws":"^8.20.0","cors":"^2.8.5","helmet":"^8.1.0","express":"^5.1.0","socket.io":"^4.8.3","reflect-metadata":"^0.2.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.4","@swc/core":"^1.15.24","@types/ws":"^8.18.1","@types/cors":"^2.8.19","unplugin-swc":"^1.5.9","@types/express":"^5.0.3"},"_npmOperationalInternal":{"tmp":"tmp/core_0.1.7_1778755072540_0.3158297681455744","host":"s3://npm-registry-packages-npm-production"}},"0.1.8":{"name":"@atlex/core","version":"0.1.8","keywords":["atlex","nodejs","framework","backend-framework","web-framework","mvc","mvc-framework","http-framework","rest-api","rest-framework","ioc-container","dependency-injection","di-container","service-provider","routing","router","http-router","middleware","controller","decorator","decorators","reflect-metadata","laravel-alternative","laravel-for-nodejs","laravel-nodejs","express-framework","express-alternative","nestjs-alternative","javascript","typescript"],"author":{"url":"https://github.com/khamazaspyan","name":"Karen Hamazaspyan"},"license":"MIT","_id":"@atlex/core@0.1.8","maintainers":[{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"}],"homepage":"https://atlex.dev","bugs":{"url":"https://github.com/atlex-framework/core/issues"},"dist":{"shasum":"cdb20f18cf37cc81621e1ba646aa0866746d6032","tarball":"https://registry.npmjs.org/@atlex/core/-/core-0.1.8.tgz","fileCount":299,"integrity":"sha512-nvG3ZDbt5WvvQNQy06dfSkMptuXKq21rPViX2qoxO445HdOcwmCgxAMzsyguCa5Ddy6UHBUYo7+xBpRVnnzeQQ==","signatures":[{"sig":"MEUCIQDE4HQSsiQ+xHg+mr8AT0cxds+nUVZigMHDkcpmb61fQgIgdwYkqpu1FQbU0mIEJQMePwWJpDbqty7bbaquqsF2LPw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":339038},"main":"./dist/index.js","type":"module","_from":"file:atlex-core-0.1.8.tgz","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./events/testing":{"types":"./dist/events/testing/EventFake.d.ts","default":"./dist/events/testing/EventFake.js"}},"scripts":{"test":"vitest run -c vitest.config.ts","build":"tsc -p tsconfig.json","typecheck":"tsc --noEmit -p tsconfig.json"},"_npmUser":{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"},"_resolved":"/tmp/67a0992a22ff96642845c9eca85dfc13/atlex-core-0.1.8.tgz","_integrity":"sha512-nvG3ZDbt5WvvQNQy06dfSkMptuXKq21rPViX2qoxO445HdOcwmCgxAMzsyguCa5Ddy6UHBUYo7+xBpRVnnzeQQ==","repository":{"url":"git+https://github.com/atlex-framework/core.git","type":"git","directory":"packages/core"},"_npmVersion":"10.9.7","description":"IoC container, routing, middleware, events, and HTTP foundation for Atlex","directories":{},"_nodeVersion":"22.22.2","dependencies":{"ws":"^8.20.0","cors":"^2.8.5","helmet":"^8.1.0","express":"^5.1.0","socket.io":"^4.8.3","reflect-metadata":"^0.2.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.4","@swc/core":"^1.15.24","@types/ws":"^8.18.1","@types/cors":"^2.8.19","unplugin-swc":"^1.5.9","@types/express":"^5.0.3"},"_npmOperationalInternal":{"tmp":"tmp/core_0.1.8_1778775511637_0.2650561224966901","host":"s3://npm-registry-packages-npm-production"}},"0.1.9":{"name":"@atlex/core","version":"0.1.9","keywords":["atlex","nodejs","framework","backend-framework","web-framework","mvc","mvc-framework","http-framework","rest-api","rest-framework","ioc-container","dependency-injection","di-container","service-provider","routing","router","http-router","middleware","controller","decorator","decorators","reflect-metadata","laravel-alternative","laravel-for-nodejs","laravel-nodejs","express-framework","express-alternative","nestjs-alternative","javascript","typescript"],"author":{"url":"https://github.com/khamazaspyan","name":"Karen Hamazaspyan"},"license":"MIT","_id":"@atlex/core@0.1.9","maintainers":[{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"}],"homepage":"https://atlex.dev","bugs":{"url":"https://github.com/atlex-framework/core/issues"},"dist":{"shasum":"00dcf3e530b0f3897253c6d54dc904e9df7800cd","tarball":"https://registry.npmjs.org/@atlex/core/-/core-0.1.9.tgz","fileCount":299,"integrity":"sha512-VEPeT3DmfdL0TUjOh9polDxtRQF+00ppryj6dBwLMjNjgLtL8Z0OGdEMEG+w+uPpNvFkimh/5DU/qd+vngD2HA==","signatures":[{"sig":"MEQCIHMyBxzZYFc0jMMjYDFUgaU0slJy5aFw62y4IAr15bzYAiBzvNTWMwHpE/7ol2RvihSOL7nLdi2o0v533WiBpXNDAw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":339038},"main":"./dist/index.js","type":"module","_from":"file:atlex-core-0.1.9.tgz","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./events/testing":{"types":"./dist/events/testing/EventFake.d.ts","default":"./dist/events/testing/EventFake.js"}},"scripts":{"test":"vitest run -c vitest.config.ts","build":"tsc -p tsconfig.json","typecheck":"tsc --noEmit -p tsconfig.json"},"_npmUser":{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"},"_resolved":"/tmp/cbfaf568b966df7400e26da2e9180f84/atlex-core-0.1.9.tgz","_integrity":"sha512-VEPeT3DmfdL0TUjOh9polDxtRQF+00ppryj6dBwLMjNjgLtL8Z0OGdEMEG+w+uPpNvFkimh/5DU/qd+vngD2HA==","repository":{"url":"git+https://github.com/atlex-framework/core.git","type":"git","directory":"packages/core"},"_npmVersion":"10.9.7","description":"IoC container, routing, middleware, events, and HTTP foundation for Atlex","directories":{},"_nodeVersion":"22.22.2","dependencies":{"ws":"^8.20.0","cors":"^2.8.5","helmet":"^8.1.0","express":"^5.1.0","socket.io":"^4.8.3","reflect-metadata":"^0.2.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.4","@swc/core":"^1.15.24","@types/ws":"^8.18.1","@types/cors":"^2.8.19","unplugin-swc":"^1.5.9","@types/express":"^5.0.3"},"_npmOperationalInternal":{"tmp":"tmp/core_0.1.9_1778830237590_0.5545520585879571","host":"s3://npm-registry-packages-npm-production"}},"0.1.10":{"name":"@atlex/core","version":"0.1.10","keywords":["atlex","nodejs","framework","backend-framework","web-framework","mvc","mvc-framework","http-framework","rest-api","rest-framework","ioc-container","dependency-injection","di-container","service-provider","routing","router","http-router","middleware","controller","decorator","decorators","reflect-metadata","laravel-alternative","laravel-for-nodejs","laravel-nodejs","express-framework","express-alternative","nestjs-alternative","javascript","typescript"],"author":{"url":"https://github.com/khamazaspyan","name":"Karen Hamazaspyan"},"license":"MIT","_id":"@atlex/core@0.1.10","maintainers":[{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"}],"homepage":"https://atlex.dev","bugs":{"url":"https://github.com/atlex-framework/core/issues"},"dist":{"shasum":"fda3596f88c1deea9f9625d80e301d0f40c97489","tarball":"https://registry.npmjs.org/@atlex/core/-/core-0.1.10.tgz","fileCount":299,"integrity":"sha512-xHDoQul1Ax/xIDLWRDKaecMB6DeZX8rAvSSh2b0p/LojYdx+c5WkmwgIw6Wkrt3W1g7ZNH3y+ex/c/9EHxVi4A==","signatures":[{"sig":"MEYCIQDBXuoIw85jOlmunCvEFD3tIgwwiQrS8TKYVVn501SxlAIhALZKwvTSifCtkgm6YftvhbMJHRglwc91i0k3gMBkyChO","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":339039},"main":"./dist/index.js","type":"module","_from":"file:atlex-core-0.1.10.tgz","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./events/testing":{"types":"./dist/events/testing/EventFake.d.ts","default":"./dist/events/testing/EventFake.js"}},"scripts":{"test":"vitest run -c vitest.config.ts","build":"tsc -p tsconfig.json","typecheck":"tsc --noEmit -p tsconfig.json"},"_npmUser":{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"},"_resolved":"/tmp/a429bbbc044cdd7cd6415ccfcbdded09/atlex-core-0.1.10.tgz","_integrity":"sha512-xHDoQul1Ax/xIDLWRDKaecMB6DeZX8rAvSSh2b0p/LojYdx+c5WkmwgIw6Wkrt3W1g7ZNH3y+ex/c/9EHxVi4A==","repository":{"url":"git+https://github.com/atlex-framework/core.git","type":"git","directory":"packages/core"},"_npmVersion":"10.9.7","description":"IoC container, routing, middleware, events, and HTTP foundation for Atlex","directories":{},"_nodeVersion":"22.22.2","dependencies":{"ws":"^8.20.0","cors":"^2.8.5","helmet":"^8.1.0","express":"^5.1.0","socket.io":"^4.8.3","reflect-metadata":"^0.2.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.4","@swc/core":"^1.15.24","@types/ws":"^8.18.1","@types/cors":"^2.8.19","unplugin-swc":"^1.5.9","@types/express":"^5.0.3"},"_npmOperationalInternal":{"tmp":"tmp/core_0.1.10_1778834095916_0.7159165242864165","host":"s3://npm-registry-packages-npm-production"}},"0.1.11":{"name":"@atlex/core","version":"0.1.11","keywords":["atlex","nodejs","framework","backend-framework","web-framework","mvc","mvc-framework","http-framework","rest-api","rest-framework","ioc-container","dependency-injection","di-container","service-provider","routing","router","http-router","middleware","controller","decorator","decorators","reflect-metadata","laravel-alternative","laravel-for-nodejs","laravel-nodejs","express-framework","express-alternative","nestjs-alternative","javascript","typescript"],"author":{"url":"https://github.com/khamazaspyan","name":"Karen Hamazaspyan"},"license":"MIT","_id":"@atlex/core@0.1.11","maintainers":[{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"}],"homepage":"https://atlex.dev","bugs":{"url":"https://github.com/atlex-framework/core/issues"},"dist":{"shasum":"a1b74632d8bd7786933702eb74a40bee8f6fc700","tarball":"https://registry.npmjs.org/@atlex/core/-/core-0.1.11.tgz","fileCount":299,"integrity":"sha512-sho6n7wFmadOuKX15r0vfEroePfBY+TO6CLBFxVf0YWKx+nrFAtvl7oXN3/goKmN0txbK6UivyHoRIk7qDDJcQ==","signatures":[{"sig":"MEQCIBN//aC3nC3WLTcgRbrForN7f/3If0LuJHg4RXwHgTAcAiA5kAyKQDHymZTrFL9qpq8UACcngpdOabtizyAzNSBxgg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":339039},"main":"./dist/index.js","type":"module","_from":"file:atlex-core-0.1.11.tgz","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./events/testing":{"types":"./dist/events/testing/EventFake.d.ts","default":"./dist/events/testing/EventFake.js"}},"scripts":{"test":"vitest run -c vitest.config.ts","build":"tsc -p tsconfig.json","typecheck":"tsc --noEmit -p tsconfig.json"},"_npmUser":{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"},"_resolved":"/tmp/5a9144869e70b60a3b65d8cd022179bf/atlex-core-0.1.11.tgz","_integrity":"sha512-sho6n7wFmadOuKX15r0vfEroePfBY+TO6CLBFxVf0YWKx+nrFAtvl7oXN3/goKmN0txbK6UivyHoRIk7qDDJcQ==","repository":{"url":"git+https://github.com/atlex-framework/core.git","type":"git","directory":"packages/core"},"_npmVersion":"10.9.8","description":"IoC container, routing, middleware, events, and HTTP foundation for Atlex","directories":{},"_nodeVersion":"22.22.3","dependencies":{"ws":"^8.20.0","cors":"^2.8.5","helmet":"^8.1.0","express":"^5.1.0","socket.io":"^4.8.3","reflect-metadata":"^0.2.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.4","@swc/core":"^1.15.24","@types/ws":"^8.18.1","@types/cors":"^2.8.19","unplugin-swc":"^1.5.9","@types/express":"^5.0.3"},"_npmOperationalInternal":{"tmp":"tmp/core_0.1.11_1780144948148_0.06366228090700066","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@atlex/core","version":"0.2.0","keywords":["atlex","nodejs","framework","backend-framework","web-framework","mvc","mvc-framework","http-framework","rest-api","rest-framework","ioc-container","dependency-injection","di-container","service-provider","routing","router","http-router","middleware","controller","decorator","decorators","reflect-metadata","laravel-alternative","laravel-for-nodejs","laravel-nodejs","express-framework","express-alternative","nestjs-alternative","javascript","typescript"],"author":{"url":"https://github.com/khamazaspyan","name":"Karen Hamazaspyan"},"license":"MIT","_id":"@atlex/core@0.2.0","maintainers":[{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"}],"homepage":"https://atlex.dev","bugs":{"url":"https://github.com/atlex-framework/core/issues"},"dist":{"shasum":"3769a4322246652f7efcddd9b717bcd7605706ca","tarball":"https://registry.npmjs.org/@atlex/core/-/core-0.2.0.tgz","fileCount":299,"integrity":"sha512-hffRkkp7GanNzp7z8m6U3fiW2uxAGtDMTlPDp09Dw86ucg3dkg8K/AMV23uJ40LPBdPtEP1OgT3NiWblM3FoQA==","signatures":[{"sig":"MEYCIQD8WnaTtIKvemNOdKEa7DKlttGvjlXw4kIaOvWLeHwK2gIhAKS86AIpB01240LNUl0qfbBDzI0KpcD2fUOHAG61LbCJ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":339038},"main":"./dist/index.js","type":"module","_from":"file:atlex-core-0.2.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./events/testing":{"types":"./dist/events/testing/EventFake.d.ts","default":"./dist/events/testing/EventFake.js"}},"scripts":{"test":"vitest run -c vitest.config.ts","build":"tsc -p tsconfig.json","typecheck":"tsc --noEmit -p tsconfig.json"},"_npmUser":{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"},"_resolved":"/tmp/41d207a10551fcaf0010596fde3325dc/atlex-core-0.2.0.tgz","_integrity":"sha512-hffRkkp7GanNzp7z8m6U3fiW2uxAGtDMTlPDp09Dw86ucg3dkg8K/AMV23uJ40LPBdPtEP1OgT3NiWblM3FoQA==","repository":{"url":"git+https://github.com/atlex-framework/core.git","type":"git","directory":"packages/core"},"_npmVersion":"10.9.8","description":"IoC container, routing, middleware, events, and HTTP foundation for Atlex","directories":{},"_nodeVersion":"22.22.3","dependencies":{"ws":"^8.20.0","cors":"^2.8.5","helmet":"^8.1.0","express":"^5.1.0","socket.io":"^4.8.3","reflect-metadata":"^0.2.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.4","@swc/core":"^1.15.24","@types/ws":"^8.18.1","@types/cors":"^2.8.19","unplugin-swc":"^1.5.9","@types/express":"^5.0.3"},"_npmOperationalInternal":{"tmp":"tmp/core_0.2.0_1780306534465_0.36901264826411806","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@atlex/core","version":"0.2.1","keywords":["atlex","nodejs","framework","backend-framework","web-framework","mvc","mvc-framework","http-framework","rest-api","rest-framework","ioc-container","dependency-injection","di-container","service-provider","routing","router","http-router","middleware","controller","decorator","decorators","reflect-metadata","laravel-alternative","laravel-for-nodejs","laravel-nodejs","express-framework","express-alternative","nestjs-alternative","javascript","typescript"],"author":{"url":"https://github.com/khamazaspyan","name":"Karen Hamazaspyan"},"license":"MIT","_id":"@atlex/core@0.2.1","maintainers":[{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"}],"homepage":"https://atlex.dev","bugs":{"url":"https://github.com/atlex-framework/core/issues"},"dist":{"shasum":"989821e579837aa6e7c7319e821d9af987f2f888","tarball":"https://registry.npmjs.org/@atlex/core/-/core-0.2.1.tgz","fileCount":299,"integrity":"sha512-EnB8XAqeVCqBNdH4y+tRAGhybTa5OTXxNPkEAMC90fc36vZY7jzzmtPOAtyobaGkKqGDcIc9qY9AabvnF15aVA==","signatures":[{"sig":"MEQCIHBiyVB8LSTGBFkix2XXpUloS6qfbBCUcOZvbyMQNFjWAiAz6GXnryP17C/nZ3pwka6WRcjsM4qLsORtHMTyAnCXTQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":339038},"main":"./dist/index.js","type":"module","_from":"file:atlex-core-0.2.1.tgz","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./events/testing":{"types":"./dist/events/testing/EventFake.d.ts","default":"./dist/events/testing/EventFake.js"}},"scripts":{"test":"vitest run -c vitest.config.ts","build":"tsc -p tsconfig.json","typecheck":"tsc --noEmit -p tsconfig.json"},"_npmUser":{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"},"_resolved":"/tmp/ab00280a8131e1d500d3939e077f5405/atlex-core-0.2.1.tgz","_integrity":"sha512-EnB8XAqeVCqBNdH4y+tRAGhybTa5OTXxNPkEAMC90fc36vZY7jzzmtPOAtyobaGkKqGDcIc9qY9AabvnF15aVA==","repository":{"url":"git+https://github.com/atlex-framework/core.git","type":"git","directory":"packages/core"},"_npmVersion":"10.9.8","description":"IoC container, routing, middleware, events, and HTTP foundation for Atlex","directories":{},"_nodeVersion":"22.22.3","dependencies":{"ws":"^8.20.0","cors":"^2.8.5","helmet":"^8.1.0","express":"^5.1.0","socket.io":"^4.8.3","reflect-metadata":"^0.2.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.4","@swc/core":"^1.15.24","@types/ws":"^8.18.1","@types/cors":"^2.8.19","unplugin-swc":"^1.5.9","@types/express":"^5.0.3"},"_npmOperationalInternal":{"tmp":"tmp/core_0.2.1_1780423650662_0.3315742481955237","host":"s3://npm-registry-packages-npm-production"}},"0.2.2":{"name":"@atlex/core","version":"0.2.2","description":"IoC container, routing, middleware, events, and HTTP foundation for Atlex","type":"module","license":"MIT","author":{"name":"Karen Hamazaspyan","url":"https://github.com/khamazaspyan"},"keywords":["atlex","nodejs","framework","backend-framework","web-framework","mvc","mvc-framework","http-framework","rest-api","rest-framework","ioc-container","dependency-injection","di-container","service-provider","routing","router","http-router","middleware","controller","decorator","decorators","reflect-metadata","laravel-alternative","laravel-for-nodejs","laravel-nodejs","express-framework","express-alternative","nestjs-alternative","javascript","typescript"],"engines":{"node":">=20"},"repository":{"type":"git","url":"git+https://github.com/atlex-framework/core.git","directory":"packages/core"},"homepage":"https://atlex.dev","bugs":{"url":"https://github.com/atlex-framework/core/issues"},"publishConfig":{"access":"public"},"main":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./events/testing":{"types":"./dist/events/testing/EventFake.d.ts","default":"./dist/events/testing/EventFake.js"}},"dependencies":{"cors":"^2.8.5","express":"^5.1.0","helmet":"^8.1.0","reflect-metadata":"^0.2.2","socket.io":"^4.8.3","ws":"^8.20.0"},"devDependencies":{"@swc/core":"^1.15.24","@types/cors":"^2.8.19","@types/express":"^5.0.3","@types/ws":"^8.18.1","unplugin-swc":"^1.5.9","vitest":"^3.2.4"},"scripts":{"build":"tsc -p tsconfig.json","typecheck":"tsc --noEmit -p tsconfig.json","test":"vitest run -c vitest.config.ts"},"_id":"@atlex/core@0.2.2","_integrity":"sha512-9T038rX71iXg3B/IEuQRHnkzZkL+KzX9w7ew5rE9xhVTE6M/07GYsDOJPpAy4EeYTransuH891Jbb5fJwnypoQ==","_resolved":"/tmp/19f1a1b752e7cfa7fc6eca1d66e00647/atlex-core-0.2.2.tgz","_from":"file:atlex-core-0.2.2.tgz","_nodeVersion":"22.23.1","_npmVersion":"10.9.8","dist":{"integrity":"sha512-9T038rX71iXg3B/IEuQRHnkzZkL+KzX9w7ew5rE9xhVTE6M/07GYsDOJPpAy4EeYTransuH891Jbb5fJwnypoQ==","shasum":"de4915613fdb790221d075ec701f86ce5ab608b3","tarball":"https://registry.npmjs.org/@atlex/core/-/core-0.2.2.tgz","fileCount":299,"unpackedSize":339038,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCICcyBoBEHzEfBggqQiscoSkckMhha3r2LILxIb8sbEPUAiEAz3EYF9GptSAfhqdbwIhj/aPprMzxY4/gFqxdgMyoPY8="}]},"_npmUser":{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"},"directories":{},"maintainers":[{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/core_0.2.2_1784391582206_0.9720851068875012"},"_hasShrinkwrap":false}},"time":{"created":"2026-04-14T19:21:08.907Z","modified":"2026-07-18T16:19:42.547Z","0.1.0-beta":"2026-04-11T21:23:17.063Z","0.1.1":"2026-04-14T19:21:09.185Z","0.1.2":"2026-04-15T06:43:00.628Z","0.1.3":"2026-04-15T12:27:48.842Z","0.1.4":"2026-04-15T13:23:57.195Z","0.1.5":"2026-04-15T13:45:07.440Z","0.1.6":"2026-05-13T17:45:45.119Z","0.1.7":"2026-05-14T10:37:52.729Z","0.1.8":"2026-05-14T16:18:31.795Z","0.1.9":"2026-05-15T07:30:37.734Z","0.1.10":"2026-05-15T08:34:56.052Z","0.1.11":"2026-05-30T12:42:28.311Z","0.2.0":"2026-06-01T09:35:34.678Z","0.2.1":"2026-06-02T18:07:30.804Z","0.2.2":"2026-07-18T16:19:42.377Z"},"bugs":{"url":"https://github.com/atlex-framework/core/issues"},"author":{"name":"Karen Hamazaspyan","url":"https://github.com/khamazaspyan"},"license":"MIT","homepage":"https://atlex.dev","keywords":["atlex","nodejs","framework","backend-framework","web-framework","mvc","mvc-framework","http-framework","rest-api","rest-framework","ioc-container","dependency-injection","di-container","service-provider","routing","router","http-router","middleware","controller","decorator","decorators","reflect-metadata","laravel-alternative","laravel-for-nodejs","laravel-nodejs","express-framework","express-alternative","nestjs-alternative","javascript","typescript"],"repository":{"type":"git","url":"git+https://github.com/atlex-framework/core.git","directory":"packages/core"},"description":"IoC container, routing, middleware, events, and HTTP foundation for Atlex","maintainers":[{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"}],"readme":"# @atlex/core\n\n> A robust, feature-rich framework core for building scalable Node.js applications\n\n[![npm](https://img.shields.io/npm/v/@atlex/core?style=flat-square&color=7c3aed)](https://www.npmjs.com/package/@atlex/core)\n[![TypeScript](https://img.shields.io/badge/TypeScript-5.0+-7c3aed?style=flat-square)](https://www.typescriptlang.org/)\n\n[![Buy Me A Coffee](https://img.shields.io/badge/Buy%20Me%20A%20Coffee-Support-yellow?style=flat-square&logo=buy-me-a-coffee)](https://buymeacoffee.com/khamazaspyan)\n\n## Installation\n\n```bash\nnpm install @atlex/core\n# or\nyarn add @atlex/core\n```\n\n## Quick Start\n\n```typescript\nimport { Application, Injectable, Controller, Get, Route } from '@atlex/core'\n\n// Define a service\n@Injectable()\nexport class UserService {\n  getUser(id: number) {\n    return { id, name: 'John Doe' }\n  }\n}\n\n// Define a controller\n@Controller()\nexport class UserController {\n  constructor(private userService: UserService) {}\n\n  @Get('/users/:id')\n  getUser(request) {\n    const user = this.userService.getUser(request.params.id)\n    return { data: user }\n  }\n}\n\n// Bootstrap your application\nconst app = new Application()\n\n// Register service providers\napp.register(new UserServiceProvider())\n\n// Register routes\nRoute.get('/health', async (request, response) => {\n  return { status: 'healthy' }\n})\n\n// Start listening\napp.listen(3000, () => {\n  console.log('Server running on port 3000')\n})\n```\n\n## Features\n\n- **Dependency Injection Container** - Powerful IoC container with automatic resolution\n- **Flexible Routing** - Fluent API and decorator-based route definitions\n- **Middleware Pipeline** - Express-like middleware with request/response handling\n- **Service Providers** - Structured application bootstrap and configuration\n- **Validation** - Built-in request validation with customizable rules\n- **Event System** - Publish/subscribe event dispatcher with decorator support\n- **Exception Handling** - Centralized error handling and custom exceptions\n- **Decorators** - Clean decorator syntax for controllers, routes, and dependency injection\n- **Request/Response Helpers** - Convenient request/response access throughout application\n- **WebSocket Server** - Room-based broadcasting with JWT auth on upgrade (v0.1.7)\n\n## Dependency Injection\n\nThe core of @atlex/core is its powerful dependency injection container that automatically resolves dependencies.\n\n### Container Binding\n\n```typescript\nimport { Container } from '@atlex/core'\n\nconst container = new Container()\n\n// Bind to a concrete instance\ncontainer.bind('config', { apiKey: 'secret' })\n\n// Bind to a singleton (resolved once, reused)\ncontainer.singleton('database', Database)\n\n// Bind with a factory function\ncontainer.bind('logger', (container) => {\n  return new Logger(container.make('config'))\n})\n\n// Create an alias\ncontainer.alias('db', 'database')\n\n// Make (resolve) from container\nconst db = container.make('database')\n```\n\n### Dependency Injection Decorators\n\n```typescript\nimport { Injectable, Singleton, Inject } from '@atlex/core'\n\n// Mark class as injectable (transient - new instance each time)\n@Injectable()\nexport class EmailService {\n  send(to: string, subject: string) {\n    // Send email logic\n  }\n}\n\n// Mark class as singleton (single instance throughout app)\n@Singleton()\nexport class DatabaseConnection {\n  private connection\n\n  connect() {\n    this.connection = this.createConnection()\n  }\n}\n\n// Inject dependencies\n@Injectable()\nexport class UserService {\n  constructor(\n    private emailService: EmailService,\n    private db: DatabaseConnection,\n    @Inject('config') private config: any,\n  ) {}\n\n  registerUser(email: string) {\n    this.emailService.send(email, 'Welcome!')\n    // Save to database\n  }\n}\n```\n\n### Advanced Container Usage\n\n```typescript\n// Contextual binding - different implementations for different classes\ncontainer.contextualRule(PaymentProcessor, 'gateway', (container) => container.make(StripeGateway))\n\ncontainer.contextualRule(ReportGenerator, 'gateway', (container) => container.make(PayPalGateway))\n\n// Check if binding exists\nif (container.has('logger')) {\n  const logger = container.make('logger')\n}\n\n// Flush and reset container\ncontainer.flush()\n```\n\n## Routing\n\nDefine routes using the fluent API or decorators for a clean, expressive syntax.\n\n### Fluent Route API\n\n```typescript\nimport { Route } from '@atlex/core'\n\n// Basic routes\nRoute.get('/users', (request, response) => {\n  return { users: [] }\n})\n\nRoute.post('/users', (request, response) => {\n  const user = request.body\n  return { id: 1, ...user }\n})\n\nRoute.put('/users/:id', (request, response) => {\n  const { id } = request.params\n  return { id, updated: true }\n})\n\nRoute.patch('/users/:id', (request, response) => {\n  return { patched: true }\n})\n\nRoute.delete('/users/:id', (request, response) => {\n  return { deleted: true }\n})\n\n// Route parameters and queries\nRoute.get('/users/:id', (request, response) => {\n  const userId = request.params.id\n  const filter = request.query.filter\n  return { userId, filter }\n})\n\n// Wildcard routes\nRoute.get('/files/*', (request, response) => {\n  return { path: request.params[0] }\n})\n\n// Named routes\nRoute.post('/users', (request, response) => {\n  return { id: 1 }\n}).name('users.store')\n\n// Route groups\nRoute.group({ prefix: '/api/v1' }, () => {\n  Route.get('/users', (request, response) => {\n    return { users: [] }\n  })\n\n  Route.post('/users', (request, response) => {\n    return { created: true }\n  })\n})\n\nRoute.group({ prefix: '/admin', middleware: ['auth', 'admin'] }, () => {\n  Route.get('/dashboard', (request, response) => {\n    return { data: 'admin' }\n  })\n})\n```\n\n### Decorator-Based Routes\n\n```typescript\nimport { Controller, Get, Post, Put, Delete, Patch } from '@atlex/core'\n\n@Controller('/api/v1/users')\nexport class UserController {\n  constructor(private userService: UserService) {}\n\n  @Get('/:id')\n  show(request) {\n    return { user: this.userService.getUser(request.params.id) }\n  }\n\n  @Post()\n  store(request) {\n    return { created: this.userService.create(request.body) }\n  }\n\n  @Put('/:id')\n  update(request) {\n    return { updated: this.userService.update(request.params.id, request.body) }\n  }\n\n  @Patch('/:id')\n  patch(request) {\n    return { patched: true }\n  }\n\n  @Delete('/:id')\n  destroy(request) {\n    return { deleted: true }\n  }\n}\n\n// Register controller with application\napp.resolveController(UserController)\n```\n\n### Middleware\n\n```typescript\nimport { Route } from '@atlex/core'\n\n// Define middleware\nconst authMiddleware = async (request, response, next) => {\n  if (!request.headers.authorization) {\n    return response.status(401).json({ error: 'Unauthorized' })\n  }\n  request.user = { id: 1, name: 'John' }\n  return next()\n}\n\nconst corsMiddleware = async (request, response, next) => {\n  response.setHeader('Access-Control-Allow-Origin', '*')\n  return next()\n}\n\n// Apply to routes\nRoute.get('/protected', authMiddleware, (request, response) => {\n  return { user: request.user }\n})\n\n// Apply to groups\nRoute.group({ middleware: [corsMiddleware] }, () => {\n  Route.get('/public', (request, response) => {\n    return { public: true }\n  })\n})\n\n// Apply globally\napp.use(corsMiddleware)\napp.use(authMiddleware)\n```\n\n## Service Providers\n\nService providers are the central place of all Atlex application bootstrap. They register bindings, boot services, and handle configuration.\n\n```typescript\nimport { ServiceProvider } from '@atlex/core'\n\nexport class DatabaseServiceProvider extends ServiceProvider {\n  // Register bindings into the container\n  register() {\n    this.app.container.singleton('database', () => {\n      return new Database({\n        host: process.env.DB_HOST,\n        port: process.env.DB_PORT,\n        username: process.env.DB_USER,\n        password: process.env.DB_PASSWORD,\n      })\n    })\n  }\n\n  // Boot the service (called after all services are registered)\n  boot() {\n    const db = this.app.container.make('database')\n    db.connect()\n  }\n}\n\nexport class CacheServiceProvider extends ServiceProvider {\n  register() {\n    this.app.container.singleton('cache', () => {\n      return new CacheManager(this.app.container.make('config.cache'))\n    })\n  }\n\n  boot() {\n    const cache = this.app.container.make('cache')\n    cache.warmup()\n  }\n}\n\n// Register providers with application\nconst app = new Application()\napp.register(new DatabaseServiceProvider())\napp.register(new CacheServiceProvider())\napp.boot()\n```\n\n## Validation\n\nValidate request data with a powerful, fluent validation API.\n\n```typescript\nimport { validate, Validator, ValidationException, MessageBag } from '@atlex/core'\n\n// Quick validation\nRoute.post('/users', async (request, response) => {\n  try {\n    const data = await validate(request.body, {\n      name: 'required|string|min:3',\n      email: 'required|email|unique:users',\n      age: 'integer|min:18',\n    })\n\n    return { user: data }\n  } catch (error) {\n    if (error instanceof ValidationException) {\n      return response.status(422).json({ errors: error.messages })\n    }\n    throw error\n  }\n})\n\n// Advanced validation\nconst validator = new Validator(request.body, {\n  name: 'required|string|max:255',\n  email: 'required|email',\n  password: 'required|min:8|confirmed',\n  website: 'url|nullable',\n  role: 'in:admin,user,guest',\n  permissions: 'array|min:1',\n})\n\nif (validator.fails()) {\n  const errors = validator.getMessageBag()\n  return response.status(422).json({ errors: errors.all() })\n}\n\nconst validated = validator.validated()\n\n// Custom validation rules\nvalidator.addRule('even', (value) => {\n  return value % 2 === 0\n})\n\nvalidator.addRule('custom-domain', (value) => {\n  return value.endsWith('@company.com')\n})\n\n// Custom error messages\nconst validator2 = new Validator(\n  request.body,\n  {\n    email: 'required|email',\n  },\n  {\n    'email.required': 'An email address is required',\n    'email.email': 'Please provide a valid email address',\n  },\n)\n```\n\n## Events\n\nPublish and subscribe to events throughout your application using a clean event system.\n\n```typescript\nimport { Event, EventDispatcher, Listen } from '@atlex/core'\n\n// Define an event\nexport class UserRegistered extends Event {\n  constructor(public user: User) {\n    super()\n  }\n}\n\nexport class OrderCreated extends Event {\n  constructor(public order: Order) {\n    super()\n  }\n}\n\n// Listen to events with decorators\n@Injectable()\nexport class SendWelcomeEmail {\n  @Listen(UserRegistered)\n  handle(event: UserRegistered) {\n    console.log(`Sending welcome email to ${event.user.email}`)\n    // Send email logic\n  }\n}\n\n@Injectable()\nexport class ProcessOrder {\n  @Listen(OrderCreated)\n  handle(event: OrderCreated) {\n    console.log(`Processing order ${event.order.id}`)\n    // Process order logic\n  }\n}\n\n// Dispatch events\nconst dispatcher = app.container.make(EventDispatcher)\ndispatcher.dispatch(new UserRegistered(user))\ndispatcher.dispatch(new OrderCreated(order))\n\n// Listen to events programmatically\ndispatcher.listen(UserRegistered, (event: UserRegistered) => {\n  console.log('User registered:', event.user)\n})\n\ndispatcher.listen(OrderCreated, (event: OrderCreated) => {\n  console.log('Order created:', event.order)\n})\n```\n\n## Exception Handling\n\nHandle exceptions globally with a centralized error handler.\n\n```typescript\nimport { Application, Exception } from '@atlex/core'\n\n// Custom exception\nexport class AuthenticationException extends Exception {\n  constructor(message = 'Unauthenticated') {\n    super(message)\n    this.status = 401\n  }\n}\n\nexport class AuthorizationException extends Exception {\n  constructor(message = 'Forbidden') {\n    super(message)\n    this.status = 403\n  }\n}\n\n// Global exception handler\napp.onException((error, request, response) => {\n  if (error instanceof ValidationException) {\n    return response.status(422).json({\n      message: 'Validation failed',\n      errors: error.messages,\n    })\n  }\n\n  if (error instanceof AuthenticationException) {\n    return response.status(401).json({\n      message: error.message,\n    })\n  }\n\n  if (error instanceof AuthorizationException) {\n    return response.status(403).json({\n      message: error.message,\n    })\n  }\n\n  // Default error response\n  return response.status(500).json({\n    message: 'Internal Server Error',\n    error: process.env.NODE_ENV === 'development' ? error.message : undefined,\n  })\n})\n\n// Throw exceptions in routes/controllers\n@Controller('/admin')\nexport class AdminController {\n  @Get('/dashboard')\n  dashboard(request) {\n    if (!request.user) {\n      throw new AuthenticationException('You must be logged in')\n    }\n\n    if (request.user.role !== 'admin') {\n      throw new AuthorizationException('You do not have permission to access this')\n    }\n\n    return { dashboard: 'data' }\n  }\n}\n```\n\n## Request and Response Helpers\n\nAccess request and response objects with convenient global helpers.\n\n```typescript\nimport { request, response } from '@atlex/core'\n\n// Access request properties\nRoute.post('/data', (req, res) => {\n  const body = req.body\n  const query = req.query\n  const params = req.params\n  const headers = req.headers\n  const method = req.method\n  const url = req.url\n\n  // Check request method\n  if (req.method === 'POST') {\n    // Handle POST\n  }\n\n  // Get header value\n  const contentType = req.header('Content-Type')\n  const bearerToken = req.header('Authorization')\n\n  // Get input from body or query\n  const name = req.input('name')\n  const page = req.input('page', 1) // with default\n\n  // Check if input exists\n  if (req.has('email')) {\n    const email = req.input('email')\n  }\n\n  return { received: true }\n})\n\n// Response helpers\nRoute.get('/data', (req, res) => {\n  // Send JSON\n  res.json({ data: 'value' })\n\n  // Send with status\n  res.status(201).json({ created: true })\n\n  // Set headers\n  res.setHeader('X-Custom', 'value')\n  res.setHeader('X-Total-Count', '100')\n\n  // Redirect\n  res.redirect('/home')\n  res.redirect(301, '/new-location')\n\n  // Download file\n  res.download('/path/to/file', 'filename.pdf')\n\n  // Send raw response\n  res.send('Hello World')\n  res.send(Buffer.from('binary data'))\n})\n```\n\n## Application Class\n\nThe main Application class orchestrates your entire application lifecycle.\n\n```typescript\nimport { Application, ServiceProvider } from '@atlex/core'\n\nconst app = new Application({\n  basePath: __dirname,\n  environment: 'production',\n})\n\n// Register service providers\napp.register(new DatabaseServiceProvider())\napp.register(new CacheServiceProvider())\napp.register(new EventServiceProvider())\n\n// Boot all providers\napp.boot()\n\n// Make instances from container\nconst userService = app.make(UserService)\nconst config = app.make('config')\n\n// Get the container directly\nconst container = app.container\n\n// Get environment\nconst env = app.environment // 'production'\nconst isDev = app.isDev() // false\nconst isProd = app.isProd() // true\n\n// Listen on port\napp.listen(3000, () => {\n  console.log('Application running on port 3000')\n})\n\n// Resolve and boot controllers\napp.resolveController(UserController)\napp.resolveController(AdminController)\n\n// Register global middleware\napp.use((request, response, next) => {\n  console.log(`${request.method} ${request.url}`)\n  return next()\n})\n\n// Handle exceptions\napp.onException((error, request, response) => {\n  console.error(error)\n  return response.status(500).json({ error: 'Server error' })\n})\n\n// Handle shutdown\nprocess.on('SIGTERM', async () => {\n  await app.shutdown()\n  process.exit(0)\n})\n```\n\n## WebSocket Server\n\n`@atlex/core` v0.1.7 ships a room-based WebSocket module with JWT auth on the HTTP upgrade handshake. Invalid or missing tokens are rejected with `401` before the WebSocket handshake completes.\n\n### Setup\n\nInstall the `ws` peer dependency if not already present:\n\n```bash\nnpm install ws\nnpm install --save-dev @types/ws\n```\n\n### Define a Gateway\n\nExtend `WsGateway` to handle connections and implement room logic:\n\n```typescript\nimport { WsGateway, WsClient } from '@atlex/core'\n\n// Augment WsClientMeta with your JWT claim shape\ndeclare module '@atlex/core' {\n  interface WsClientMeta {\n    userId: string\n    familyId: string\n  }\n}\n\nexport class AppWsGateway extends WsGateway {\n  handleConnection(client: WsClient): void {\n    // Subscribe the client to rooms on connect\n    client.join(`family:${client.meta.familyId}`)\n    client.join(`device:${client.meta.userId}`)\n  }\n\n  handleDisconnect(_client: WsClient): void {\n    // Client is removed from all rooms automatically after this hook\n  }\n}\n```\n\n### Register with the App\n\nPass `WsServiceProvider` a `gateway` class and a `verifyToken` callback before `app.listen()`:\n\n```typescript\nimport { WsServiceProvider } from '@atlex/core'\nimport { AppWsGateway } from './AppWsGateway.js'\n\napp.register(\n  new WsServiceProvider({\n    gateway: AppWsGateway,\n    verifyToken: async (token) => {\n      // Return decoded JWT claims — throw to reject the upgrade\n      return app.make(JwtProvider).verify(token)\n    },\n  }),\n)\n\napp.boot().listen(3000)\n```\n\nThe token is read from the `Authorization: Bearer <token>` header or the `?token=` query parameter.\n\n### Broadcast from Anywhere\n\nResolve the gateway from the container and call `broadcast`:\n\n```typescript\nconst gw = app.make(AppWsGateway)\n\n// Broadcast to everyone in a room\ngw.broadcast('family:abc123', 'location:update', { lat: 40.7, lng: -74.0 })\n\n// Send to a specific client\nclient.send('status:update', { online: true })\n```\n\n### Room Management\n\n`WsRoom` tracks which clients are in which rooms. `client.join` / `client.leave` are scoped to the current client — use them inside `handleConnection`:\n\n```typescript\nhandleConnection(client: WsClient): void {\n  client.join('global')\n  client.join(`family:${client.meta.familyId}`)\n}\n\n// Check room size (via the injected WsRoom)\nconst room = app.make<WsRoom>('ws.room')\nconsole.log(room.size('family:abc123')) // number of connected clients\n```\n\n### WebSocket API Reference\n\n#### WsGateway\n\n| Method / Property                 | Description                              |\n| --------------------------------- | ---------------------------------------- |\n| `handleConnection(client)`        | Abstract — called on successful JWT auth |\n| `handleDisconnect(client)`        | Abstract — called on socket close        |\n| `broadcast(room, event, payload)` | Send JSON event to all clients in a room |\n\n#### WsClient\n\n| Method / Property      | Description                               |\n| ---------------------- | ----------------------------------------- |\n| `socket`               | Raw `ws.WebSocket` instance               |\n| `meta`                 | Decoded JWT claims (`WsClientMeta`)       |\n| `rooms`                | `Set<string>` of current room memberships |\n| `join(room)`           | Subscribe to a room (idempotent)          |\n| `leave(room)`          | Unsubscribe from a room                   |\n| `send(event, payload)` | Send a typed event to this client only    |\n\n#### WsServiceProvider options\n\n| Option        | Type                                       | Description                       |\n| ------------- | ------------------------------------------ | --------------------------------- |\n| `gateway`     | `typeof WsGateway`                         | Your gateway subclass to register |\n| `verifyToken` | `(token: string) => Promise<WsClientMeta>` | Token validator; throw to reject  |\n\n## API Overview\n\n### Container\n\n| Method                                        | Description                              |\n| --------------------------------------------- | ---------------------------------------- |\n| `bind(key, value \\| factory)`                 | Bind a value or factory to the container |\n| `singleton(key, constructor \\| factory)`      | Bind a singleton (single instance)       |\n| `instance(key, instance)`                     | Register a pre-built instance            |\n| `alias(alias, key)`                           | Create an alias for a binding            |\n| `make(key)`                                   | Resolve and return a binding             |\n| `contextualRule(concrete, abstract, factory)` | Set contextual binding                   |\n| `has(key)`                                    | Check if binding exists                  |\n| `flush()`                                     | Clear all bindings                       |\n\n### Route\n\n| Method                     | Description                         |\n| -------------------------- | ----------------------------------- |\n| `get(path, handler)`       | Register GET route                  |\n| `post(path, handler)`      | Register POST route                 |\n| `put(path, handler)`       | Register PUT route                  |\n| `patch(path, handler)`     | Register PATCH route                |\n| `delete(path, handler)`    | Register DELETE route               |\n| `group(options, callback)` | Group routes with shared attributes |\n| `middleware(names)`        | Apply middleware to route           |\n| `name(name)`               | Give route a name                   |\n\n### Decorators\n\n| Decorator              | Target    | Purpose                        |\n| ---------------------- | --------- | ------------------------------ |\n| `@Injectable()`        | Class     | Mark as injectable (transient) |\n| `@Singleton()`         | Class     | Mark as singleton              |\n| `@Inject(key?)`        | Parameter | Inject dependency              |\n| `@Controller(prefix?)` | Class     | Define controller              |\n| `@Get(path?)`          | Method    | GET route handler              |\n| `@Post(path?)`         | Method    | POST route handler             |\n| `@Put(path?)`          | Method    | PUT route handler              |\n| `@Patch(path?)`        | Method    | PATCH route handler            |\n| `@Delete(path?)`       | Method    | DELETE route handler           |\n| `@Listen(event)`       | Method    | Listen to event                |\n| `@Middleware(names)`   | Method    | Apply middleware to handler    |\n\n### Validation\n\n| Class/Function                     | Purpose                                |\n| ---------------------------------- | -------------------------------------- |\n| `validate(data, rules, messages?)` | Quick validation function              |\n| `Validator`                        | Full validation class                  |\n| `ValidationException`              | Exception thrown on validation failure |\n| `MessageBag`                       | Collection of validation messages      |\n\n### Events\n\n| Class                 | Purpose                       |\n| --------------------- | ----------------------------- |\n| `Event`               | Base event class              |\n| `EventDispatcher`     | Central event dispatcher      |\n| `@Listen(eventClass)` | Decorator to listen to events |\n\n## Configuration\n\nConfigure the application through environment variables and a configuration file.\n\n```typescript\n// config/app.ts\nexport default {\n  name: 'Atlex Application',\n  environment: process.env.NODE_ENV || 'development',\n  debug: process.env.APP_DEBUG === 'true',\n  key: process.env.APP_KEY,\n}\n\n// config/database.ts\nexport default {\n  default: process.env.DB_CONNECTION || 'postgres',\n  connections: {\n    postgres: {\n      driver: 'postgres',\n      host: process.env.DB_HOST,\n      port: process.env.DB_PORT,\n      database: process.env.DB_NAME,\n      username: process.env.DB_USER,\n      password: process.env.DB_PASSWORD,\n    },\n  },\n}\n\n// Access configuration\nconst app = new Application()\nconst appConfig = app.make('config.app')\nconst dbConfig = app.make('config.database')\n```\n\n## Documentation\n\nFor detailed documentation, examples, and API reference, visit the [Atlex documentation](https://atlex.dev/docs).\n\n## License\n\n## MIT\n\nPart of [Atlex](https://atlex.dev) — A modern framework for Node.js.\n","readmeFilename":"README.md"}