{"_id":"@atlex/orm","_rev":"15-c6f482c5023627db5fd30e0389a7c90a","name":"@atlex/orm","dist-tags":{"latest":"0.2.2"},"versions":{"0.1.1":{"name":"@atlex/orm","version":"0.1.1","keywords":["atlex","orm","typescript","active-record","database"],"author":{"url":"https://github.com/khamazaspyan","name":"Karen Hamazaspyan"},"license":"MIT","_id":"@atlex/orm@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":"8a65398f98477339884b5ea0b1cf094f75bef36d","tarball":"https://registry.npmjs.org/@atlex/orm/-/orm-0.1.1.tgz","fileCount":139,"integrity":"sha512-Tjp/dw4rAWRR+rCyIrTidSiAmmWPC0s1Jd/ECcMqOSn1S+qSxPR8TJL5FuSgYusjjpKCv/YqEJc1moi28ZPH2Q==","signatures":[{"sig":"MEUCIQDHf+WWTLwvMBZQx1APIs0RaA3FK4jBgFUimqj+xtbbVAIgAP9fjUL2aViuTozmXjWzs80x8NOfoETQdexvu/T7lAM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":433997},"main":"./dist/index.js","type":"module","_from":"file:atlex-orm-0.1.1.tgz","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.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/931b434a1599f6a88363b496b3a56846/atlex-orm-0.1.1.tgz","_integrity":"sha512-Tjp/dw4rAWRR+rCyIrTidSiAmmWPC0s1Jd/ECcMqOSn1S+qSxPR8TJL5FuSgYusjjpKCv/YqEJc1moi28ZPH2Q==","repository":{"url":"git+https://github.com/atlex-framework/atlex-monorepo.git","type":"git","directory":"packages/orm"},"_npmVersion":"10.9.7","description":"ActiveRecord ORM, query builder, migrations, and factories for Atlex","directories":{},"_nodeVersion":"22.22.2","dependencies":{"pg":"^8.11.0","knex":"^3.1.0","mysql2":"^3.9.0","better-sqlite3":"^12.8.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.4","@types/pg":"^8.11.0","typescript":"^5.0.0","@types/node":"^20.0.0","@types/better-sqlite3":"^7.6.8"},"peerDependencies":{"@atlex/config":"0.1.1"},"peerDependenciesMeta":{"@atlex/config":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/orm_0.1.1_1776194484631_0.6892678162414723","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@atlex/orm","version":"0.1.2","keywords":["atlex","orm","typescript","active-record","database"],"author":{"url":"https://github.com/khamazaspyan","name":"Karen Hamazaspyan"},"license":"MIT","_id":"@atlex/orm@0.1.2","maintainers":[{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"}],"homepage":"https://atlex.dev","bugs":{"url":"https://github.com/atlex-framework/orm/issues"},"dist":{"shasum":"35516526b4daa284053517511e1fa7478d92311d","tarball":"https://registry.npmjs.org/@atlex/orm/-/orm-0.1.2.tgz","fileCount":139,"integrity":"sha512-Qjs4T/h41X5qGt5hUUiuxBEVTN89lz2cIT6jFtEJOS6CAVDy2EtdZB/O5wVF1Egc/4geyqkJa50MXlBIOKFGqA==","signatures":[{"sig":"MEYCIQDRXD4OgSJTSOMPkOtQivWgYDNW+AeIY/yPrLkjGcO2uwIhAMxyQBLZo3TJeYonPvzLuB2VeK14W/H7PSAMxh7DnQrW","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":433975},"main":"./dist/index.js","type":"module","_from":"file:atlex-orm-0.1.2.tgz","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.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/9bca2488ea2d0e1df6ce154e6af62f89/atlex-orm-0.1.2.tgz","_integrity":"sha512-Qjs4T/h41X5qGt5hUUiuxBEVTN89lz2cIT6jFtEJOS6CAVDy2EtdZB/O5wVF1Egc/4geyqkJa50MXlBIOKFGqA==","repository":{"url":"git+https://github.com/atlex-framework/orm.git","type":"git","directory":"packages/orm"},"_npmVersion":"10.9.7","description":"ActiveRecord ORM, query builder, migrations, and factories for Atlex","directories":{},"_nodeVersion":"22.22.2","dependencies":{"pg":"^8.11.0","knex":"^3.1.0","mysql2":"^3.9.0","better-sqlite3":"^12.8.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.4","@types/pg":"^8.11.0","typescript":"^5.0.0","@types/node":"^20.0.0","@types/better-sqlite3":"^7.6.8"},"peerDependencies":{"@atlex/config":"0.1.2"},"peerDependenciesMeta":{"@atlex/config":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/orm_0.1.2_1776235398147_0.18370742940047036","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@atlex/orm","version":"0.1.3","keywords":["atlex","orm","typescript","active-record","database"],"author":{"url":"https://github.com/khamazaspyan","name":"Karen Hamazaspyan"},"license":"MIT","_id":"@atlex/orm@0.1.3","maintainers":[{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"}],"homepage":"https://atlex.dev","bugs":{"url":"https://github.com/atlex-framework/orm/issues"},"dist":{"shasum":"f74081f8d269073a4fe8fdbb35e095bc45ce1861","tarball":"https://registry.npmjs.org/@atlex/orm/-/orm-0.1.3.tgz","fileCount":139,"integrity":"sha512-PR/ayTUZbPUH5Gpvxfs3eV47vMzkJbcESjo33MVaXFfLflChASsNyNRXDxhSZqeEVFIXrsBdg1XP/voEiF49vg==","signatures":[{"sig":"MEUCIQCo9NUKmfDFi9Zcp/JlZK9M7bOHWWYa01ke/UeXgrVA0QIgBk57NOZMyG12Uf943wIaJyMHq1UIqJYvHP4ZzEFeRYY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":433975},"main":"./dist/index.js","type":"module","_from":"file:atlex-orm-0.1.3.tgz","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.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/3eabdd282cbf2908a41df7546f74f926/atlex-orm-0.1.3.tgz","_integrity":"sha512-PR/ayTUZbPUH5Gpvxfs3eV47vMzkJbcESjo33MVaXFfLflChASsNyNRXDxhSZqeEVFIXrsBdg1XP/voEiF49vg==","repository":{"url":"git+https://github.com/atlex-framework/orm.git","type":"git","directory":"packages/orm"},"_npmVersion":"10.9.7","description":"ActiveRecord ORM, query builder, migrations, and factories for Atlex","directories":{},"_nodeVersion":"22.22.2","dependencies":{"pg":"^8.11.0","knex":"^3.1.0","mysql2":"^3.9.0","better-sqlite3":"^12.8.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.4","@types/pg":"^8.11.0","typescript":"^5.0.0","@types/node":"^20.0.0","@types/better-sqlite3":"^7.6.8"},"peerDependencies":{"@atlex/config":"0.1.3"},"peerDependenciesMeta":{"@atlex/config":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/orm_0.1.3_1776256088257_0.4169406940078606","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"@atlex/orm","version":"0.1.4","keywords":["atlex","orm","active-record","activerecord","query-builder","database","sql","migrations","migration","seeder","factory","eloquent","eloquent-nodejs","eloquent-alternative","prisma-alternative","sequelize-alternative","typeorm-alternative","knex","postgres","postgresql","mysql","sqlite","laravel-orm","laravel-eloquent","laravel-alternative","nodejs","javascript","typescript"],"author":{"url":"https://github.com/khamazaspyan","name":"Karen Hamazaspyan"},"license":"MIT","_id":"@atlex/orm@0.1.4","maintainers":[{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"}],"homepage":"https://atlex.dev","bugs":{"url":"https://github.com/atlex-framework/orm/issues"},"dist":{"shasum":"d34d0477bd9e159ef3d20815ca558ef86b3053b5","tarball":"https://registry.npmjs.org/@atlex/orm/-/orm-0.1.4.tgz","fileCount":139,"integrity":"sha512-FQUKCmn+4N/JrWk+PmtmpuwLHeyo42BBTPnnZXih3J8yFZVT+6UQkymDxGVGopRlcQVdfwxK1JAjFE1SK0RFQg==","signatures":[{"sig":"MEUCIHvlhnQSjx9aEy/xzzmxvx8anAFf7W0/HN+wyMauaeoIAiEA/c7N9Xa23g1SgPIs0bp8xikAoS5bXmPKI1MaH3CHTY4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":434519},"main":"./dist/index.js","type":"module","_from":"file:atlex-orm-0.1.4.tgz","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.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/8d5e4e191fc91b7041049927f8930e1b/atlex-orm-0.1.4.tgz","_integrity":"sha512-FQUKCmn+4N/JrWk+PmtmpuwLHeyo42BBTPnnZXih3J8yFZVT+6UQkymDxGVGopRlcQVdfwxK1JAjFE1SK0RFQg==","repository":{"url":"git+https://github.com/atlex-framework/orm.git","type":"git","directory":"packages/orm"},"_npmVersion":"10.9.7","description":"ActiveRecord ORM, query builder, migrations, and factories for Atlex","directories":{},"_nodeVersion":"22.22.2","dependencies":{"pg":"^8.11.0","knex":"^3.1.0","mysql2":"^3.9.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.4","@types/pg":"^8.11.0","typescript":"^5.0.0","@types/node":"^20.0.0","@types/better-sqlite3":"^7.6.8"},"peerDependencies":{"@atlex/config":"0.1.4"},"optionalDependencies":{"better-sqlite3":"^12.8.0"},"peerDependenciesMeta":{"@atlex/config":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/orm_0.1.4_1776259455531_0.6779106944775806","host":"s3://npm-registry-packages-npm-production"}},"0.1.5":{"name":"@atlex/orm","version":"0.1.5","keywords":["atlex","orm","active-record","activerecord","query-builder","database","sql","migrations","migration","seeder","factory","eloquent","eloquent-nodejs","eloquent-alternative","prisma-alternative","sequelize-alternative","typeorm-alternative","knex","postgres","postgresql","mysql","sqlite","laravel-orm","laravel-eloquent","laravel-alternative","nodejs","javascript","typescript"],"author":{"url":"https://github.com/khamazaspyan","name":"Karen Hamazaspyan"},"license":"MIT","_id":"@atlex/orm@0.1.5","maintainers":[{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"}],"homepage":"https://atlex.dev","bugs":{"url":"https://github.com/atlex-framework/orm/issues"},"dist":{"shasum":"4900d95b585ffa8496756f133be8632e49004c7c","tarball":"https://registry.npmjs.org/@atlex/orm/-/orm-0.1.5.tgz","fileCount":139,"integrity":"sha512-01ahhTjMNYKaE9hGOhfy/1CYS4eUJspv1WZm+TOP3b8vLNkdsWnNAL5yBJFluri7f1GEx0VRbS4DmljjpX4mqw==","signatures":[{"sig":"MEYCIQC6jgkJuV5CJmam7JxYSKT0onrEi/OB7FiX5/yAHVLluQIhANrOjssjBHvS2Qqk7ARkvEOO8U6CFntQw5JMlQtWt1Gx","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":434542},"main":"./dist/index.js","type":"module","_from":"file:atlex-orm-0.1.5.tgz","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.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/8af8bf36d22103cb6bb371b931c7ba4b/atlex-orm-0.1.5.tgz","_integrity":"sha512-01ahhTjMNYKaE9hGOhfy/1CYS4eUJspv1WZm+TOP3b8vLNkdsWnNAL5yBJFluri7f1GEx0VRbS4DmljjpX4mqw==","repository":{"url":"git+https://github.com/atlex-framework/orm.git","type":"git","directory":"packages/orm"},"_npmVersion":"10.9.7","description":"ActiveRecord ORM, query builder, migrations, and factories for Atlex","directories":{},"_nodeVersion":"22.22.2","dependencies":{"pg":"^8.11.0","knex":"^3.1.0","mysql2":"^3.9.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.4","@types/pg":"^8.11.0","typescript":"^5.0.0","@types/node":"^20.0.0","@types/better-sqlite3":"^7.6.8"},"peerDependencies":{"@atlex/config":"0.1.5","better-sqlite3":">=11.0.0"},"peerDependenciesMeta":{"@atlex/config":{"optional":true},"better-sqlite3":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/orm_0.1.5_1776260730921_0.07494131314336538","host":"s3://npm-registry-packages-npm-production"}},"0.1.6":{"name":"@atlex/orm","version":"0.1.6","keywords":["atlex","orm","active-record","activerecord","query-builder","database","sql","migrations","migration","seeder","factory","eloquent","eloquent-nodejs","eloquent-alternative","prisma-alternative","sequelize-alternative","typeorm-alternative","knex","postgres","postgresql","mysql","sqlite","laravel-orm","laravel-eloquent","laravel-alternative","nodejs","javascript","typescript"],"author":{"url":"https://github.com/khamazaspyan","name":"Karen Hamazaspyan"},"license":"MIT","_id":"@atlex/orm@0.1.6","maintainers":[{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"}],"homepage":"https://atlex.dev","bugs":{"url":"https://github.com/atlex-framework/orm/issues"},"dist":{"shasum":"9707faaf2289541b6a7c5eec86d8afb4614d6596","tarball":"https://registry.npmjs.org/@atlex/orm/-/orm-0.1.6.tgz","fileCount":139,"integrity":"sha512-yYf4FxZQP/DBx6j6LcwzLKr9GZ8HpHwRUimt1Cvm3wd0qWldxeiCKGtglFmrwuCfv4AqlExqMzVKcaniBxl+mA==","signatures":[{"sig":"MEQCIEDqwUY0o+WlcMSHX7XQVmbNR+TsMl0v+6fmCAtdP74mAiBPaE6pe3QpKAFQFllZM9x2iZPxKSM7T5mt+C0L8nr+aQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":434542},"main":"./dist/index.js","type":"module","_from":"file:atlex-orm-0.1.6.tgz","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.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/5da54ce66905beaaaaf74d24a6f3d601/atlex-orm-0.1.6.tgz","_integrity":"sha512-yYf4FxZQP/DBx6j6LcwzLKr9GZ8HpHwRUimt1Cvm3wd0qWldxeiCKGtglFmrwuCfv4AqlExqMzVKcaniBxl+mA==","repository":{"url":"git+https://github.com/atlex-framework/orm.git","type":"git","directory":"packages/orm"},"_npmVersion":"10.9.7","description":"ActiveRecord ORM, query builder, migrations, and factories for Atlex","directories":{},"_nodeVersion":"22.22.2","dependencies":{"pg":"^8.11.0","knex":"^3.1.0","mysql2":"^3.9.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.4","@types/pg":"^8.11.0","typescript":"^5.0.0","@types/node":"^20.0.0","@types/better-sqlite3":"^7.6.8"},"peerDependencies":{"@atlex/config":"0.1.6","better-sqlite3":">=11.0.0"},"peerDependenciesMeta":{"@atlex/config":{"optional":true},"better-sqlite3":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/orm_0.1.6_1778694363834_0.01352390724053576","host":"s3://npm-registry-packages-npm-production"}},"0.1.7":{"name":"@atlex/orm","version":"0.1.7","keywords":["atlex","orm","active-record","activerecord","query-builder","database","sql","migrations","migration","seeder","factory","eloquent","eloquent-nodejs","eloquent-alternative","prisma-alternative","sequelize-alternative","typeorm-alternative","knex","postgres","postgresql","mysql","sqlite","laravel-orm","laravel-eloquent","laravel-alternative","nodejs","javascript","typescript"],"author":{"url":"https://github.com/khamazaspyan","name":"Karen Hamazaspyan"},"license":"MIT","_id":"@atlex/orm@0.1.7","maintainers":[{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"}],"homepage":"https://atlex.dev","bugs":{"url":"https://github.com/atlex-framework/orm/issues"},"dist":{"shasum":"031d17aef213ce2b9b7bf23959aa621557f91ae1","tarball":"https://registry.npmjs.org/@atlex/orm/-/orm-0.1.7.tgz","fileCount":139,"integrity":"sha512-LdWl0eg/eDqedvw9hqmmKsko2mTtK0AN+uWAfcfNIVcL/M/Df1nra6fZ7icHpHTSJA7TlmaLXvt9CbeYGWz09A==","signatures":[{"sig":"MEYCIQCzVgdPbzAaug9ioHTXzSMwCENFS7vxKPYceH70O0+ShQIhALo1//iJ9/S7qkKFXgsazAlnE/9RBYTN108fFxf9itQM","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":434542},"main":"./dist/index.js","type":"module","_from":"file:atlex-orm-0.1.7.tgz","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.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/32cbd3e9aa2161bae4312cf27610f362/atlex-orm-0.1.7.tgz","_integrity":"sha512-LdWl0eg/eDqedvw9hqmmKsko2mTtK0AN+uWAfcfNIVcL/M/Df1nra6fZ7icHpHTSJA7TlmaLXvt9CbeYGWz09A==","repository":{"url":"git+https://github.com/atlex-framework/orm.git","type":"git","directory":"packages/orm"},"_npmVersion":"10.9.7","description":"ActiveRecord ORM, query builder, migrations, and factories for Atlex","directories":{},"_nodeVersion":"22.22.2","dependencies":{"pg":"^8.11.0","knex":"^3.1.0","mysql2":"^3.9.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.4","@types/pg":"^8.11.0","typescript":"^5.0.0","@types/node":"^20.0.0","@types/better-sqlite3":"^7.6.8"},"peerDependencies":{"@atlex/config":"0.1.7","better-sqlite3":">=11.0.0"},"peerDependenciesMeta":{"@atlex/config":{"optional":true},"better-sqlite3":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/orm_0.1.7_1778755092606_0.4552751114419247","host":"s3://npm-registry-packages-npm-production"}},"0.1.8":{"name":"@atlex/orm","version":"0.1.8","keywords":["atlex","orm","active-record","activerecord","query-builder","database","sql","migrations","migration","seeder","factory","eloquent","eloquent-nodejs","eloquent-alternative","prisma-alternative","sequelize-alternative","typeorm-alternative","knex","postgres","postgresql","mysql","sqlite","laravel-orm","laravel-eloquent","laravel-alternative","nodejs","javascript","typescript"],"author":{"url":"https://github.com/khamazaspyan","name":"Karen Hamazaspyan"},"license":"MIT","_id":"@atlex/orm@0.1.8","maintainers":[{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"}],"homepage":"https://atlex.dev","bugs":{"url":"https://github.com/atlex-framework/orm/issues"},"dist":{"shasum":"2797242c36d70fa324acb4af4cdc1064e3d761ab","tarball":"https://registry.npmjs.org/@atlex/orm/-/orm-0.1.8.tgz","fileCount":139,"integrity":"sha512-+72qSwwebRmC+eOnA/HlAMOs2uSrCPZ9YISOCO+QPw5hVZ6moX7xumPlEOtPK/erbdpLVIimKuo72ITqI2dTog==","signatures":[{"sig":"MEUCIGrP/8saWPdpAT6wMoct1cgUV9cl5tnJtoavHQV7lKe4AiEAxY6jK4wxxreDS2PK5jqFysHFBJsyzVnxHnNMm/8qim8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":434542},"main":"./dist/index.js","type":"module","_from":"file:atlex-orm-0.1.8.tgz","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.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/72a950df7fcad6a55783639a173ec950/atlex-orm-0.1.8.tgz","_integrity":"sha512-+72qSwwebRmC+eOnA/HlAMOs2uSrCPZ9YISOCO+QPw5hVZ6moX7xumPlEOtPK/erbdpLVIimKuo72ITqI2dTog==","repository":{"url":"git+https://github.com/atlex-framework/orm.git","type":"git","directory":"packages/orm"},"_npmVersion":"10.9.7","description":"ActiveRecord ORM, query builder, migrations, and factories for Atlex","directories":{},"_nodeVersion":"22.22.2","dependencies":{"pg":"^8.11.0","knex":"^3.1.0","mysql2":"^3.9.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.4","@types/pg":"^8.11.0","typescript":"^5.0.0","@types/node":"^20.0.0","@types/better-sqlite3":"^7.6.8"},"peerDependencies":{"@atlex/config":"0.1.8","better-sqlite3":">=11.0.0"},"peerDependenciesMeta":{"@atlex/config":{"optional":true},"better-sqlite3":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/orm_0.1.8_1778775530743_0.5898930671677611","host":"s3://npm-registry-packages-npm-production"}},"0.1.10":{"name":"@atlex/orm","version":"0.1.10","keywords":["atlex","orm","active-record","activerecord","query-builder","database","sql","migrations","migration","seeder","factory","eloquent","eloquent-nodejs","eloquent-alternative","prisma-alternative","sequelize-alternative","typeorm-alternative","knex","postgres","postgresql","mysql","sqlite","laravel-orm","laravel-eloquent","laravel-alternative","nodejs","javascript","typescript"],"author":{"url":"https://github.com/khamazaspyan","name":"Karen Hamazaspyan"},"license":"MIT","_id":"@atlex/orm@0.1.10","maintainers":[{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"}],"homepage":"https://atlex.dev","bugs":{"url":"https://github.com/atlex-framework/orm/issues"},"dist":{"shasum":"bfe2b900d1e62f24894cb517bc1732592bcc2cf6","tarball":"https://registry.npmjs.org/@atlex/orm/-/orm-0.1.10.tgz","fileCount":139,"integrity":"sha512-ZoWb7A0frbUD6WRcoz2qxlTDA02z6gJwFbKGfFL2MXNZT8fEQTZWoNG8Kq9CRIiV9oDkZiVEwX537mR6mIYSlg==","signatures":[{"sig":"MEYCIQCTS3PL9wwD5sG/R+JPYlgNzA42ZMgt7sVwLa61Hv69uAIhAKd/WfeukTWWuox9uDZnmBcFsJBlAslYrdo+Sidy5UAC","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":440757},"main":"./dist/index.js","type":"module","_from":"file:atlex-orm-0.1.10.tgz","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.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/c225732d3e9df0b6e1a520108ea86284/atlex-orm-0.1.10.tgz","_integrity":"sha512-ZoWb7A0frbUD6WRcoz2qxlTDA02z6gJwFbKGfFL2MXNZT8fEQTZWoNG8Kq9CRIiV9oDkZiVEwX537mR6mIYSlg==","repository":{"url":"git+https://github.com/atlex-framework/orm.git","type":"git","directory":"packages/orm"},"_npmVersion":"10.9.7","description":"ActiveRecord ORM, query builder, migrations, and factories for Atlex","directories":{},"_nodeVersion":"22.22.2","dependencies":{"pg":"^8.11.0","knex":"^3.1.0","mysql2":"^3.9.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.4","@types/pg":"^8.11.0","typescript":"^5.0.0","@types/node":"^20.0.0","@types/better-sqlite3":"^7.6.8"},"peerDependencies":{"@atlex/config":"0.1.9","better-sqlite3":">=11.0.0"},"peerDependenciesMeta":{"@atlex/config":{"optional":true},"better-sqlite3":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/orm_0.1.10_1778830256381_0.18575106126562102","host":"s3://npm-registry-packages-npm-production"}},"0.1.11":{"name":"@atlex/orm","version":"0.1.11","keywords":["atlex","orm","active-record","activerecord","query-builder","database","sql","migrations","migration","seeder","factory","eloquent","eloquent-nodejs","eloquent-alternative","prisma-alternative","sequelize-alternative","typeorm-alternative","knex","postgres","postgresql","mysql","sqlite","laravel-orm","laravel-eloquent","laravel-alternative","nodejs","javascript","typescript"],"author":{"url":"https://github.com/khamazaspyan","name":"Karen Hamazaspyan"},"license":"MIT","_id":"@atlex/orm@0.1.11","maintainers":[{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"}],"homepage":"https://atlex.dev","bugs":{"url":"https://github.com/atlex-framework/orm/issues"},"dist":{"shasum":"12e01794831f021ce9e100372dd4afce8b8152ae","tarball":"https://registry.npmjs.org/@atlex/orm/-/orm-0.1.11.tgz","fileCount":139,"integrity":"sha512-8z8JR2pkdAqD/z51vT/h7RkHukG3e35CH8CX0cG16RFhetxYgsUAcVxEdYNDKRLvf8EU6+SGN5qrla2+zv/ibg==","signatures":[{"sig":"MEUCIQDsNl0AqT1C/WaYWh8+4zzyhaqoybQO0l33lE3DxEz5eQIgTFhpc1bKBGnZUfRcSfvdcawGiFzEhBleBDQMm1MpwQY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":440674},"main":"./dist/index.js","type":"module","_from":"file:atlex-orm-0.1.11.tgz","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.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/4e31a7fa13ae1af0265f3610f279a6c7/atlex-orm-0.1.11.tgz","_integrity":"sha512-8z8JR2pkdAqD/z51vT/h7RkHukG3e35CH8CX0cG16RFhetxYgsUAcVxEdYNDKRLvf8EU6+SGN5qrla2+zv/ibg==","repository":{"url":"git+https://github.com/atlex-framework/orm.git","type":"git","directory":"packages/orm"},"_npmVersion":"10.9.8","description":"ActiveRecord ORM, query builder, migrations, and factories for Atlex","directories":{},"_nodeVersion":"22.22.3","dependencies":{"pg":"^8.11.0","knex":"^3.1.0","mysql2":"^3.9.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.4","@types/pg":"^8.11.0","typescript":"^5.0.0","@types/node":"^20.0.0","@types/better-sqlite3":"^7.6.8"},"peerDependencies":{"better-sqlite3":">=11.0.0"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/orm_0.1.11_1780144964696_0.8010526179562896","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@atlex/orm","version":"0.2.0","keywords":["atlex","orm","active-record","activerecord","query-builder","database","sql","migrations","migration","seeder","factory","eloquent","eloquent-nodejs","eloquent-alternative","prisma-alternative","sequelize-alternative","typeorm-alternative","knex","postgres","postgresql","mysql","sqlite","laravel-orm","laravel-eloquent","laravel-alternative","nodejs","javascript","typescript"],"author":{"url":"https://github.com/khamazaspyan","name":"Karen Hamazaspyan"},"license":"MIT","_id":"@atlex/orm@0.2.0","maintainers":[{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"}],"homepage":"https://atlex.dev","bugs":{"url":"https://github.com/atlex-framework/orm/issues"},"dist":{"shasum":"24f5cbdb08e485e743c4ca1511751e84a35f029b","tarball":"https://registry.npmjs.org/@atlex/orm/-/orm-0.2.0.tgz","fileCount":139,"integrity":"sha512-oPRnp0plvJKv0Tkphf3T2Fe0/MyUjT4glcgS+zp+3JF3p9VJb5sBwqOSbAWU6OKyJcDAimCvk1cKWXyD47LR4A==","signatures":[{"sig":"MEQCIAZsIcsWLae+fnLgalxaPLHlLSsY1IoX+vLfKK1ZnLEuAiAU7JEDdkWdPmBTBfDQ1BmEI2NXNHbZbv1saefD9IgZYA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":440673},"main":"./dist/index.js","type":"module","_from":"file:atlex-orm-0.2.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.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/21a72bb82e83b3830675f5142cbf6bf0/atlex-orm-0.2.0.tgz","_integrity":"sha512-oPRnp0plvJKv0Tkphf3T2Fe0/MyUjT4glcgS+zp+3JF3p9VJb5sBwqOSbAWU6OKyJcDAimCvk1cKWXyD47LR4A==","repository":{"url":"git+https://github.com/atlex-framework/orm.git","type":"git","directory":"packages/orm"},"_npmVersion":"10.9.8","description":"ActiveRecord ORM, query builder, migrations, and factories for Atlex","directories":{},"_nodeVersion":"22.22.3","dependencies":{"pg":"^8.11.0","knex":"^3.1.0","mysql2":"^3.9.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.4","@types/pg":"^8.11.0","typescript":"^5.0.0","@types/node":"^20.0.0","@types/better-sqlite3":"^7.6.8"},"peerDependencies":{"better-sqlite3":">=11.0.0"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/orm_0.2.0_1780306553304_0.2978470933279842","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@atlex/orm","version":"0.2.1","keywords":["atlex","orm","active-record","activerecord","query-builder","database","sql","migrations","migration","seeder","factory","eloquent","eloquent-nodejs","eloquent-alternative","prisma-alternative","sequelize-alternative","typeorm-alternative","knex","postgres","postgresql","mysql","sqlite","laravel-orm","laravel-eloquent","laravel-alternative","nodejs","javascript","typescript"],"author":{"url":"https://github.com/khamazaspyan","name":"Karen Hamazaspyan"},"license":"MIT","_id":"@atlex/orm@0.2.1","maintainers":[{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"}],"homepage":"https://atlex.dev","bugs":{"url":"https://github.com/atlex-framework/orm/issues"},"dist":{"shasum":"4fb9e43fe90e802ce472fe56d92e0704aa89f072","tarball":"https://registry.npmjs.org/@atlex/orm/-/orm-0.2.1.tgz","fileCount":139,"integrity":"sha512-DIaHrnn41j5diuFS0X3hqAsuZYPbjq5IuLt6+ogsJrbnWswGfiJlf0yTKY9dqByqNv1skM+gjTo6ylAd45kjpA==","signatures":[{"sig":"MEUCIClsHWpLW0AR2RTomXGXtaSwCIxwhgILv5Tu0rDtueoWAiEA2EdjC/nn0qP3We0h+2ubrGlofPiv40yoCrHeCIc4IsM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":441451},"main":"./dist/index.js","type":"module","_from":"file:atlex-orm-0.2.1.tgz","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.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/a7b378e6e9eb4419bce23ef134fecdf6/atlex-orm-0.2.1.tgz","_integrity":"sha512-DIaHrnn41j5diuFS0X3hqAsuZYPbjq5IuLt6+ogsJrbnWswGfiJlf0yTKY9dqByqNv1skM+gjTo6ylAd45kjpA==","repository":{"url":"git+https://github.com/atlex-framework/orm.git","type":"git","directory":"packages/orm"},"_npmVersion":"10.9.8","description":"ActiveRecord ORM, query builder, migrations, and factories for Atlex","directories":{},"_nodeVersion":"22.22.3","dependencies":{"pg":"^8.11.0","knex":"^3.1.0","mysql2":"^3.9.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.4","@types/pg":"^8.11.0","typescript":"^5.0.0","@types/node":"^20.0.0","@types/better-sqlite3":"^7.6.8"},"peerDependencies":{"better-sqlite3":">=11.0.0"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/orm_0.2.1_1780423673921_0.32397356255573473","host":"s3://npm-registry-packages-npm-production"}},"0.2.2":{"name":"@atlex/orm","version":"0.2.2","description":"ActiveRecord ORM, query builder, migrations, and factories for Atlex","type":"module","license":"MIT","author":{"name":"Karen Hamazaspyan","url":"https://github.com/khamazaspyan"},"keywords":["atlex","orm","active-record","activerecord","query-builder","database","sql","migrations","migration","seeder","factory","eloquent","eloquent-nodejs","eloquent-alternative","prisma-alternative","sequelize-alternative","typeorm-alternative","knex","postgres","postgresql","mysql","sqlite","laravel-orm","laravel-eloquent","laravel-alternative","nodejs","javascript","typescript"],"engines":{"node":">=20"},"repository":{"type":"git","url":"git+https://github.com/atlex-framework/orm.git","directory":"packages/orm"},"homepage":"https://atlex.dev","bugs":{"url":"https://github.com/atlex-framework/orm/issues"},"publishConfig":{"access":"public"},"main":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"dependencies":{"knex":"^3.1.0","mysql2":"^3.9.0","pg":"^8.11.0"},"peerDependencies":{"better-sqlite3":">=11.0.0"},"peerDependenciesMeta":{"better-sqlite3":{"optional":true}},"devDependencies":{"@types/better-sqlite3":"^7.6.8","@types/node":"^20.0.0","@types/pg":"^8.11.0","typescript":"^5.0.0","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/orm@0.2.2","_integrity":"sha512-FNfoLUUHw/P0XZAyD5FknxcznZq5BgOb0q/dpaB93AqmIZNwDwLXqLnFTYVwEGbYso9qgVbXEaK/fYhRF047qw==","_resolved":"/tmp/8aa1ca3f0adeb83f71849e483860b22f/atlex-orm-0.2.2.tgz","_from":"file:atlex-orm-0.2.2.tgz","_nodeVersion":"22.23.1","_npmVersion":"10.9.8","dist":{"integrity":"sha512-FNfoLUUHw/P0XZAyD5FknxcznZq5BgOb0q/dpaB93AqmIZNwDwLXqLnFTYVwEGbYso9qgVbXEaK/fYhRF047qw==","shasum":"114be55e5dd4544313e39ac87a9658e6d852f6e9","tarball":"https://registry.npmjs.org/@atlex/orm/-/orm-0.2.2.tgz","fileCount":139,"unpackedSize":442059,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDgIejnw62asFVUh7bjlibvEr7jFEOwrsjZcMy3D5G2xwIgH+fJh0IjrM5jUfNpwzF338PmfFHQevYFnDLCAl4//08="}]},"_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/orm_0.2.2_1784391601174_0.12085629793468544"},"_hasShrinkwrap":false}},"time":{"created":"2026-04-14T19:21:24.528Z","modified":"2026-07-18T16:20:01.521Z","0.1.0-beta":"2026-04-11T21:23:35.332Z","0.1.1":"2026-04-14T19:21:24.915Z","0.1.2":"2026-04-15T06:43:18.300Z","0.1.3":"2026-04-15T12:28:08.412Z","0.1.4":"2026-04-15T13:24:15.701Z","0.1.5":"2026-04-15T13:45:31.078Z","0.1.6":"2026-05-13T17:46:04.035Z","0.1.7":"2026-05-14T10:38:12.748Z","0.1.8":"2026-05-14T16:18:50.955Z","0.1.10":"2026-05-15T07:30:56.546Z","0.1.11":"2026-05-30T12:42:44.862Z","0.2.0":"2026-06-01T09:35:53.470Z","0.2.1":"2026-06-02T18:07:54.059Z","0.2.2":"2026-07-18T16:20:01.320Z"},"bugs":{"url":"https://github.com/atlex-framework/orm/issues"},"author":{"name":"Karen Hamazaspyan","url":"https://github.com/khamazaspyan"},"license":"MIT","homepage":"https://atlex.dev","keywords":["atlex","orm","active-record","activerecord","query-builder","database","sql","migrations","migration","seeder","factory","eloquent","eloquent-nodejs","eloquent-alternative","prisma-alternative","sequelize-alternative","typeorm-alternative","knex","postgres","postgresql","mysql","sqlite","laravel-orm","laravel-eloquent","laravel-alternative","nodejs","javascript","typescript"],"repository":{"type":"git","url":"git+https://github.com/atlex-framework/orm.git","directory":"packages/orm"},"description":"ActiveRecord ORM, query builder, migrations, and factories for Atlex","maintainers":[{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"}],"readme":"# @atlex/orm\n\n> A powerful, expressive ActiveRecord ORM for building modern Node.js applications\n\n[![npm](https://img.shields.io/npm/v/@atlex/orm?style=flat-square&color=7c3aed)](https://www.npmjs.com/package/@atlex/orm)\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/orm\n# or\nyarn add @atlex/orm\n```\n\n## Quick Start\n\n```typescript\nimport { Model } from '@atlex/orm'\n\nexport class User extends Model {\n  protected table = 'users'\n  protected fillable = ['name', 'email', 'age']\n}\n\n// Query the database\nconst users = await User.all()\nconst user = await User.find(1)\nconst activeUsers = await User.where('status', 'active').get()\n\n// Create and save\nconst newUser = await User.create({\n  name: 'John Doe',\n  email: 'john@example.com',\n  age: 30,\n})\n\n// Update and delete\nawait user.update({ status: 'inactive' })\nawait user.delete()\n```\n\n## Features\n\n- **ActiveRecord Pattern** - Models represent database tables with intuitive API\n- **Fluent Query Builder** - Build complex queries with a chainable interface\n- **Relationships** - Support for hasOne, hasMany, belongsTo, belongsToMany, and more\n- **Model Hooks** - Lifecycle hooks for creating, updating, and deleting models\n- **Soft Deletes** - Gracefully delete records without removing them from database\n- **Global Scopes** - Automatically filter queries with global scope rules\n- **Eager Loading** - Load related models with the `with()` method\n- **Pagination** - Built-in length-aware, simple, and cursor pagination\n- **Mass Assignment** - Protect against mass assignment with fillable and guarded properties\n- **Schema Builder** - Define and manage database migrations with fluent API\n- **Type Safety** - Full TypeScript support with strict type checking\n\n## Models\n\nModels are the heart of @atlex/orm. They represent database tables and provide a fluent API for querying and manipulating data.\n\n### Defining Models\n\n```typescript\nimport { Model } from '@atlex/orm'\n\nexport class User extends Model {\n  protected table = 'users'\n  protected primaryKey = 'id'\n  protected timestamps = true\n  protected hidden = ['password']\n  protected fillable = ['name', 'email', 'age']\n  protected appends = ['fullName']\n\n  // Computed attribute\n  get fullName(): string {\n    return `${this.getAttribute('first_name')} ${this.getAttribute('last_name')}`\n  }\n}\n\nexport class Post extends Model {\n  protected table = 'posts'\n  protected guarded = ['id', 'created_at', 'updated_at']\n  protected timestamps = true\n}\n\nexport class Product extends Model {\n  protected table = 'products'\n  protected fillable = ['name', 'price', 'description']\n  protected casts = {\n    price: 'decimal:2',\n    is_active: 'boolean',\n    metadata: 'json',\n  }\n}\n```\n\n### Model Properties\n\n- `table` - Database table name (defaults to pluralized model name)\n- `primaryKey` - Primary key column (defaults to 'id')\n- `timestamps` - Enable automatic created_at/updated_at (defaults to true)\n- `hidden` - Attributes hidden in serialization\n- `fillable` - Attributes that can be mass assigned\n- `guarded` - Attributes protected from mass assignment\n- `appends` - Attributes to append when serializing\n- `casts` - Type casting for attributes\n\n### Querying Models\n\n```typescript\n// Get all records\nconst users = await User.all()\n\n// Get with select columns\nconst users = await User.select('id', 'name', 'email').get()\n\n// Find by primary key\nconst user = await User.find(1)\n\n// Find or fail\nconst user = await User.findOrFail(1)\n\n// Find multiple\nconst users = await User.findMany([1, 2, 3])\n\n// Get first record\nconst user = await User.first()\n\n// Get first record or fail\nconst user = await User.firstOrFail()\n\n// Count records\nconst count = await User.count()\n\n// Check existence\nconst exists = await User.where('email', 'john@example.com').exists()\n\n// Get specific column values\nconst emails = await User.pluck('email')\n\n// Get with default value\nconst user = (await User.find(1)) ?? new User()\n```\n\n### Filtering and Conditions\n\n```typescript\n// Basic where clause\nconst users = await User.where('status', 'active').get()\nconst users = await User.where('age', '>', 18).get()\n\n// Where with operators\nconst users = await User.where('age', '>=', 18).get()\nconst users = await User.where('role', '!=', 'guest').get()\nconst users = await User.where('email', 'like', '%@example.com').get()\n\n// Multiple where conditions\nconst users = await User.where('status', 'active')\n  .where('age', '>', 18)\n  .where('role', 'admin')\n  .get()\n\n// Or conditions\nconst users = await User.where('status', 'active').orWhere('role', 'admin').get()\n\n// Where in array\nconst users = await User.whereIn('role', ['admin', 'moderator']).get()\nconst users = await User.whereNotIn('status', ['banned', 'suspended']).get()\n\n// Where null\nconst users = await User.whereNull('deleted_at').get()\nconst users = await User.whereNotNull('verified_at').get()\n\n// Where between\nconst users = await User.whereBetween('age', [18, 65]).get()\nconst users = await User.whereNotBetween('created_at', [startDate, endDate]).get()\n\n// Raw where clause\nconst users = await User.whereRaw('LOWER(email) = LOWER(?)', ['john@example.com']).get()\n\n// Where date\nconst users = await User.whereDate('created_at', '2024-01-15').get()\n\n// Where year/month/day\nconst users = await User.whereYear('created_at', 2024).get()\nconst users = await User.whereMonth('created_at', 1).get()\nconst users = await User.whereDay('created_at', 15).get()\n```\n\n### Ordering and Limiting\n\n```typescript\n// Order by ascending\nconst users = await User.orderBy('created_at', 'asc').get()\n\n// Order by descending\nconst users = await User.orderBy('name', 'desc').get()\n\n// Latest (order by created_at descending)\nconst users = await User.latest().get()\nconst users = await User.latest('updated_at').get()\n\n// Oldest (order by created_at ascending)\nconst users = await User.oldest().get()\n\n// Random order\nconst users = await User.inRandomOrder().get()\n\n// Multiple order by\nconst users = await User.orderBy('role', 'asc').orderBy('name', 'asc').get()\n\n// Limit and offset\nconst users = await User.limit(10).get()\nconst users = await User.limit(10).offset(20).get()\n\n// Take (alias for limit)\nconst users = await User.take(5).get()\n\n// Skip (alias for offset)\nconst users = await User.skip(10).take(5).get()\n```\n\n### Aggregations\n\n```typescript\n// Count records\nconst count = await User.count()\nconst count = await User.where('status', 'active').count()\n\n// Get max value\nconst maxAge = await User.max('age')\n\n// Get min value\nconst minAge = await User.min('age')\n\n// Get sum\nconst totalAmount = await Order.sum('amount')\n\n// Get average\nconst avgPrice = await Product.avg('price')\n\n// Get specific columns\nconst stats = await User.select('role').count().groupBy('role').get()\n```\n\n### Distinct Results\n\n```typescript\n// Get distinct records\nconst roles = await User.distinct('role').pluck('role')\n\n// Distinct with select\nconst results = await User.distinct().select('city', 'country').get()\n```\n\n### Creating and Saving\n\n```typescript\n// Create via constructor and save\nconst user = new User()\nuser.name = 'John Doe'\nuser.email = 'john@example.com'\nawait user.save()\n\n// Create via create method (mass assignment)\nconst user = await User.create({\n  name: 'Jane Doe',\n  email: 'jane@example.com',\n  age: 25,\n})\n\n// Create multiple\nconst users = await User.createMany([\n  { name: 'User 1', email: 'user1@example.com' },\n  { name: 'User 2', email: 'user2@example.com' },\n])\n\n// First or create\nconst user = await User.firstOrCreate({ email: 'john@example.com' }, { name: 'John Doe', age: 30 })\n\n// Update or create\nconst user = await User.updateOrCreate({ email: 'john@example.com' }, { name: 'John Doe', age: 31 })\n\n// Insert raw (no model instantiation)\nawait User.insert({\n  name: 'Bulk User',\n  email: 'bulk@example.com',\n  created_at: new Date(),\n})\n\n// Insert many\nawait User.insertMany([\n  { name: 'User 1', email: 'user1@example.com' },\n  { name: 'User 2', email: 'user2@example.com' },\n])\n```\n\n### Updating and Deleting\n\n```typescript\n// Update single model\nconst user = await User.find(1)\nuser.status = 'inactive'\nawait user.save()\n\n// Update via method\nconst user = await User.find(1)\nawait user.update({ status: 'inactive', email: 'new@example.com' })\n\n// Update query result\nconst updated = await User.where('status', 'pending').update({ status: 'approved' })\n\n// Increment/decrement\nawait User.find(1).increment('login_count')\nawait User.find(1).decrement('remaining_days')\nawait User.find(1).increment('points', 10)\n\n// Delete single model\nconst user = await User.find(1)\nawait user.delete()\n\n// Delete query result\nconst deleted = await User.where('status', 'inactive').delete()\n\n// Force delete (soft deleted records)\nawait user.forceDelete()\n\n// Restore soft deleted\nawait user.restore()\n```\n\n## Relationships\n\nDefine relationships between models using fluent API.\n\n### One-to-One (hasOne)\n\n```typescript\nexport class User extends Model {\n  profile() {\n    return this.hasOne(Profile, 'user_id', 'id')\n  }\n}\n\nexport class Profile extends Model {\n  user() {\n    return this.belongsTo(User, 'user_id', 'id')\n  }\n}\n\n// Usage\nconst user = await User.find(1)\nconst profile = await user.profile().first()\n\n// Eager load\nconst users = await User.with('profile').get()\n```\n\n### One-to-Many (hasMany)\n\n```typescript\nexport class User extends Model {\n  posts() {\n    return this.hasMany(Post, 'user_id', 'id')\n  }\n}\n\nexport class Post extends Model {\n  author() {\n    return this.belongsTo(User, 'user_id', 'id')\n  }\n}\n\n// Usage\nconst user = await User.find(1)\nconst posts = await user.posts().get()\n\n// Eager load\nconst users = await User.with('posts').get()\n\n// Create related model\nconst post = await user.posts().create({\n  title: 'New Post',\n  content: 'Content here',\n})\n```\n\n### Many-to-Many (belongsToMany)\n\n```typescript\nexport class User extends Model {\n  roles() {\n    return this.belongsToMany(\n      Role,\n      'user_roles', // pivot table\n      'user_id', // foreign key on pivot\n      'role_id', // other foreign key on pivot\n    )\n  }\n}\n\nexport class Role extends Model {\n  users() {\n    return this.belongsToMany(User, 'user_roles', 'role_id', 'user_id')\n  }\n}\n\n// Usage\nconst user = await User.find(1)\nconst roles = await user.roles().get()\n\n// Attach relationship\nawait user.roles().attach(roleId)\nawait user.roles().attach([roleId1, roleId2])\n\n// Attach with pivot data\nawait user.roles().attach(roleId, { assigned_by: 'admin' })\n\n// Detach relationship\nawait user.roles().detach(roleId)\nawait user.roles().detach([roleId1, roleId2])\n\n// Sync relationships\nawait user.roles().sync([roleId1, roleId2])\n\n// Toggle relationships\nawait user.roles().toggle(roleId)\n\n// Access pivot data\nconst roles = await user.roles().get()\nroles.forEach((role) => {\n  console.log(role.pivot.assigned_by)\n})\n```\n\n### Has Many Through (hasManyThrough)\n\n```typescript\nexport class User extends Model {\n  comments() {\n    return this.hasManyThrough(Comment, Post, 'user_id', 'post_id')\n  }\n}\n\n// Usage\nconst user = await User.find(1)\nconst comments = await user.comments().get()\n```\n\n### Has One Through (hasOneThrough)\n\n```typescript\nexport class User extends Model {\n  latestPost() {\n    return this.hasOneThrough(Post, User, 'id', 'user_id')\n  }\n}\n```\n\n## Eager Loading\n\nEager load related models to avoid N+1 queries.\n\n```typescript\n// With single relationship\nconst users = await User.with('profile').get()\n\n// With multiple relationships\nconst users = await User.with('profile', 'posts', 'roles').get()\n\n// With nested relationships\nconst users = await User.with('posts.comments').get()\n\n// With count of related models\nconst users = await User.withCount('posts').get()\n\n// With custom count\nconst users = await User.withCount({\n  posts: (query) => query.where('published', true),\n}).get()\n\n// Lazy eager loading\nconst users = await User.all()\nawait User.with('profile').loadMissing(users)\n```\n\n## Model Hooks\n\nHook into model lifecycle events.\n\n```typescript\nexport class User extends Model {\n  protected static booted = false\n\n  static boot() {\n    if (this.booted) return\n\n    // Before creating\n    this.creating((model) => {\n      console.log('User creating:', model.name)\n    })\n\n    // After creating\n    this.created((model) => {\n      console.log('User created:', model.id)\n    })\n\n    // Before updating\n    this.updating((model) => {\n      console.log('User updating:', model.id)\n    })\n\n    // After updating\n    this.updated((model) => {\n      console.log('User updated:', model.id)\n    })\n\n    // Before saving (both create and update)\n    this.saving((model) => {\n      model.email = model.email.toLowerCase()\n    })\n\n    // After saving\n    this.saved((model) => {\n      console.log('User saved:', model.id)\n    })\n\n    // Before deleting\n    this.deleting((model) => {\n      console.log('User deleting:', model.id)\n    })\n\n    // After deleting\n    this.deleted((model) => {\n      console.log('User deleted:', model.id)\n    })\n\n    this.booted = true\n  }\n}\n```\n\n## Global Scopes\n\nAutomatically filter queries with global scope rules.\n\n```typescript\nexport class User extends Model {\n  protected static booted = false\n\n  static boot() {\n    this.addGlobalScope('active', (query) => {\n      return query.where('status', 'active')\n    })\n\n    this.booted = true\n  }\n}\n\n// Usage\nconst users = await User.all() // Only active users\n\n// Bypass global scope\nconst users = await User.withoutGlobalScope('active').get()\nconst users = await User.withoutGlobalScopes().get()\n```\n\n## Query Scopes\n\nReusable query filters using scopes.\n\n```typescript\nexport class User extends Model {\n  // Define scope\n  scope_active(query) {\n    return query.where('status', 'active')\n  }\n\n  scope_admins(query) {\n    return query.where('role', 'admin')\n  }\n\n  scope_createdBetween(query, startDate, endDate) {\n    return query.whereBetween('created_at', [startDate, endDate])\n  }\n}\n\n// Usage\nconst users = await User.active().get()\nconst admins = await User.admins().get()\nconst recentUsers = await User.createdBetween(startDate, endDate).active().get()\n```\n\n## Model Observers\n\nObserve multiple models with a single observer class.\n\n```typescript\nexport class UserObserver {\n  creating(user: User) {\n    console.log('Creating user:', user.name)\n  }\n\n  created(user: User) {\n    console.log('Created user:', user.id)\n  }\n\n  updating(user: User) {\n    console.log('Updating user:', user.id)\n  }\n\n  updated(user: User) {\n    console.log('Updated user:', user.id)\n  }\n\n  deleting(user: User) {\n    console.log('Deleting user:', user.id)\n  }\n\n  deleted(user: User) {\n    console.log('Deleted user:', user.id)\n  }\n}\n\n// Register observer\nUser.observe(UserObserver)\n```\n\n## Soft Deletes\n\nGracefully delete records without removing them from database.\n\n```typescript\nimport { Model, SoftDeletes } from '@atlex/orm'\n\nexport class User extends Model {\n  use(SoftDeletes)\n\n  protected dates = ['deleted_at']\n}\n\n// Usage\nconst user = await User.find(1)\nawait user.delete() // Sets deleted_at timestamp\n\n// Query includes soft deleted records\nconst users = await User.all()\n\n// Get only soft deleted\nconst deleted = await User.onlyTrashed().get()\n\n// Include soft deleted\nconst users = await User.withTrashed().get()\n\n// Permanently delete\nawait user.forceDelete()\n\n// Restore\nawait user.restore()\n```\n\n## Pagination\n\nPaginate query results easily.\n\n```typescript\n// Length-aware pagination\nconst users = await User.paginate(15, 1) // 15 per page, page 1\nconst pagination = users // LengthAwarePaginator instance\n\npagination.data() // Array of users\npagination.currentPage() // 1\npagination.perPage() // 15\npagination.total() // Total count\npagination.lastPage() // Last page number\npagination.hasPages() // true/false\npagination.hasMorePages() // true/false\npagination.links() // Pagination links\n\n// Simple pagination (no total count)\nconst users = await User.simplePaginate(15, 1)\n\n// Cursor pagination\nconst users = await User.cursorPaginate(15)\nusers.cursor() // Cursor for next page\nusers.getPathQueryString() // Query string\n```\n\n## Joins\n\nJoin tables in queries.\n\n```typescript\n// Inner join\nconst users = await User.join('posts', 'users.id', 'posts.user_id')\n  .select('users.name', 'posts.title')\n  .get()\n\n// Left join\nconst users = await User.leftJoin('posts', 'users.id', 'posts.user_id').get()\n\n// Join with where\nconst users = await User.leftJoin('posts', 'users.id', 'posts.user_id')\n  .where('posts.published', true)\n  .get()\n\n// Raw join\nconst users = await User.joinRaw('left join posts on users.id = posts.user_id').get()\n```\n\n## Grouping and Having\n\nGroup and filter grouped results.\n\n```typescript\n// Group by\nconst grouped = await User.select('role', User.raw('COUNT(*) as count')).groupBy('role').get()\n\n// Having clause\nconst results = await User.select('role', User.raw('COUNT(*) as count'))\n  .groupBy('role')\n  .having('count', '>', 5)\n  .get()\n\n// Having raw\nconst results = await User.groupBy('role').havingRaw('COUNT(*) > 5').get()\n```\n\n## Database Migrations\n\nDefine database schema with fluent API.\n\n```typescript\nimport { Schema, Blueprint } from '@atlex/orm'\n\n// Create table\nawait Schema.create('users', (table: Blueprint) => {\n  table.increments('id')\n  table.string('name')\n  table.string('email').unique()\n  table.string('password')\n  table.string('phone').nullable()\n  table.enum('role', ['admin', 'user', 'guest']).default('user')\n  table.boolean('is_active').default(true)\n  table.json('metadata').nullable()\n  table.timestamps()\n})\n\n// Modify table\nawait Schema.table('users', (table: Blueprint) => {\n  table.string('avatar').nullable()\n  table.softDeletes()\n})\n\n// Drop table\nawait Schema.dropIfExists('users')\n```\n\n### Column Types\n\n```typescript\n// Numeric\ntable.increments('id') // Auto-incrementing integer\ntable.bigIncrements('id') // Big auto-incrementing integer\ntable.integer('age') // Integer\ntable.bigInteger('views') // Big integer\ntable.smallInteger('level') // Small integer\ntable.decimal('price', 8, 2) // Decimal with precision\ntable.float('rating') // Float\ntable.double('value') // Double\n\n// String\ntable.string('name') // VARCHAR\ntable.string('email', 100) // VARCHAR with length\ntable.text('description') // TEXT\ntable.longText('content') // LONGTEXT\ntable.char('code', 2) // CHAR\ntable.enum('status', ['a', 'b']) // ENUM\n\n// Date/Time\ntable.date('birthday') // DATE\ntable.dateTime('published_at') // DATETIME\ntable.timestamp('created_at') // TIMESTAMP\ntable.timestamps() // created_at, updated_at\ntable.softDeletes() // deleted_at for soft deletes\n\n// JSON\ntable.json('metadata') // JSON\n\n// Boolean\ntable.boolean('is_active') // BOOLEAN\n\n// Binary\ntable.binary('data') // BINARY\n\n// Nullable\ntable.string('phone').nullable()\n\n// Default value\ntable.string('role').default('user')\n\n// Unique\ntable.string('email').unique()\n\n// Index\ntable.string('username').index()\n\n// Foreign key\ntable.foreign('user_id').references('id').on('users')\n```\n\n### Modifiers\n\n```typescript\ntable.string('email').unique().nullable()\ntable.integer('age').default(0).unsigned()\ntable.string('status').default('active').index()\ntable.bigInteger('count').unsigned().default(0)\ntable.timestamps().nullable()\n```\n\n## Connection Registry\n\nManage multiple database connections.\n\n```typescript\nimport { ConnectionRegistry } from '@atlex/orm'\n\nconst registry = new ConnectionRegistry({\n  default: 'postgres',\n  connections: {\n    postgres: {\n      driver: 'postgres',\n      host: 'localhost',\n      port: 5432,\n      database: 'myapp',\n      user: 'postgres',\n      password: 'password',\n    },\n    mysql: {\n      driver: 'mysql',\n      host: 'localhost',\n      port: 3306,\n      database: 'myapp',\n      user: 'root',\n      password: 'password',\n    },\n  },\n})\n\n// Get connection\nconst connection = registry.connection('postgres')\n\n// Use different connection in model\nexport class AnalyticsUser extends User {\n  protected connection = 'mysql'\n}\n```\n\n## API Overview\n\n### Model Static Methods\n\n| Method                             | Description               |\n| ---------------------------------- | ------------------------- |\n| `query()`                          | Start a new query builder |\n| `where(column, operator?, value?)` | Filter records            |\n| `all()`                            | Get all records           |\n| `find(id)`                         | Find by primary key       |\n| `findOrFail(id)`                   | Find or throw exception   |\n| `findMany(ids)`                    | Find multiple records     |\n| `create(attributes)`               | Create and save           |\n| `firstOrCreate(where, create?)`    | First or create           |\n| `updateOrCreate(where, update)`    | Update or create          |\n| `paginate(perPage, page)`          | Paginate results          |\n| `simplePaginate(perPage, page)`    | Simple pagination         |\n| `cursorPaginate(perPage)`          | Cursor pagination         |\n| `with(...relations)`               | Eager load relations      |\n| `withCount(...relations)`          | Count relations           |\n| `observe(observer)`                | Register observer         |\n| `scope(name, callback)`            | Define scope              |\n| `addGlobalScope(name, callback)`   | Add global scope          |\n\n### Model Instance Methods\n\n| Method                      | Description                |\n| --------------------------- | -------------------------- |\n| `save()`                    | Save model to database     |\n| `update(attributes)`        | Update and save            |\n| `delete()`                  | Soft delete                |\n| `forceDelete()`             | Permanently delete         |\n| `restore()`                 | Restore soft deleted       |\n| `fresh()`                   | Reload from database       |\n| `getAttribute(name)`        | Get attribute value        |\n| `setAttribute(name, value)` | Set attribute value        |\n| `hasOne(...args)`           | Define one-to-one          |\n| `hasMany(...args)`          | Define one-to-many         |\n| `belongsTo(...args)`        | Define inverse one-to-many |\n| `belongsToMany(...args)`    | Define many-to-many        |\n\n### QueryBuilder Methods\n\n| Method                              | Description          |\n| ----------------------------------- | -------------------- |\n| `select(...columns)`                | Select columns       |\n| `where(column, operator?, value?)`  | WHERE clause         |\n| `whereIn(column, values)`           | WHERE IN clause      |\n| `whereNull(column)`                 | WHERE NULL clause    |\n| `whereBetween(column, range)`       | WHERE BETWEEN clause |\n| `whereRaw(raw, bindings?)`          | Raw WHERE clause     |\n| `join(table, on)`                   | INNER JOIN           |\n| `leftJoin(table, on)`               | LEFT JOIN            |\n| `groupBy(...columns)`               | GROUP BY             |\n| `having(column, operator?, value?)` | HAVING clause        |\n| `orderBy(column, direction?)`       | ORDER BY             |\n| `latest(column?)`                   | ORDER BY DESC        |\n| `oldest(column?)`                   | ORDER BY ASC         |\n| `limit(count)`                      | LIMIT                |\n| `offset(count)`                     | OFFSET               |\n| `distinct()`                        | DISTINCT             |\n| `count()`                           | COUNT aggregate      |\n| `max(column)`                       | MAX aggregate        |\n| `min(column)`                       | MIN aggregate        |\n| `sum(column)`                       | SUM aggregate        |\n| `avg(column)`                       | AVG aggregate        |\n| `get()`                             | Get all results      |\n| `first()`                           | Get first result     |\n| `firstOrFail()`                     | Get first or fail    |\n| `find(id)`                          | Find by primary key  |\n| `create(attributes)`                | Create record        |\n| `insert(attributes)`                | Insert record        |\n| `update(attributes)`                | Update records       |\n| `delete()`                          | Delete records       |\n| `paginate(perPage, page)`           | Paginate             |\n| `with(...relations)`                | Eager load           |\n| `withCount(...relations)`           | Count relations      |\n\n### Pagination Classes\n\n| Class                  | Description                |\n| ---------------------- | -------------------------- |\n| `LengthAwarePaginator` | Full pagination with total |\n| `Paginator`            | Simple pagination          |\n| `CursorPaginator`      | Cursor-based pagination    |\n\n## Exceptions\n\n| Exception                 | Description                 |\n| ------------------------- | --------------------------- |\n| `ModelNotFoundException`  | Model not found             |\n| `MassAssignmentException` | Mass assignment not allowed |\n| `QueryException`          | Database query error        |\n\n## Configuration\n\nConfigure database connections through environment variables.\n\n```typescript\n// .env\nDB_CONNECTION = postgres\nDB_HOST = localhost\nDB_PORT = 5432\nDB_DATABASE = myapp\nDB_USER = postgres\nDB_PASSWORD = secret\n\n// config/database.ts\nexport default {\n  default: process.env.DB_CONNECTION,\n  connections: {\n    postgres: {\n      driver: 'postgres',\n      host: process.env.DB_HOST,\n      port: process.env.DB_PORT,\n      database: process.env.DB_DATABASE,\n      user: process.env.DB_USER,\n      password: process.env.DB_PASSWORD,\n    },\n  },\n}\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"}