{"_id":"@aginix/adonis-rls","_rev":"5-a2672fe38e3941f3d2ad44a40d14ad5a","name":"@aginix/adonis-rls","dist-tags":{"latest":"1.0.4"},"versions":{"1.0.0":{"name":"@aginix/adonis-rls","version":"1.0.0","keywords":["adonisjs","adonis","lucid","rls","row-level-security","authorization","multitenant"],"author":{"name":"n3n"},"license":"MIT","_id":"@aginix/adonis-rls@1.0.0","maintainers":[{"name":"n3n","email":"nonpawit.tee@gmail.com"}],"c8":{"exclude":["tests/**"],"reporter":["text","html"]},"dist":{"shasum":"a52c80508ea9fea04cac444431843fd936a027fb","tarball":"https://registry.npmjs.org/@aginix/adonis-rls/-/adonis-rls-1.0.0.tgz","fileCount":30,"integrity":"sha512-iX0HxSl57BGl4ZT9f1/3EDLMlAciB+lef99b/r+nTiQd4qDzJ91KJCjk9H9j0LSAlokfmwPb8yGJ6GYbGCxMrQ==","signatures":[{"sig":"MEQCIFzbUD5bAa7rVurjJL0spq3eADE1jWsVmBZvZVylIAESAiAj1fWIH5suB3h7/8M7Z1Dlo+RIpvbxd0YfyICM9qYxVg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":67346},"main":"build/index.js","type":"module","types":"./build/index.d.ts","tsdown":{"dts":false,"clean":true,"entry":["./index.ts","./configure.ts","./stubs/main.ts","./src/types.ts","./src/errors.ts","./src/actor_context.ts","./src/define_config.ts","./src/rls_marker.ts","./src/scope_runner.ts","./src/preload_patcher.ts","./src/rls_aware_query_builder.ts","./src/row_level_security_mixin.ts","./src/middleware/inject_actor_middleware.ts"],"format":"esm","minify":"dce-only","outDir":"./build","target":"esnext","external":["@adonisjs/core","@adonisjs/core/http","@adonisjs/core/types","@adonisjs/core/types/helpers","@adonisjs/core/types/http","@adonisjs/core/commands/configure","@adonisjs/lucid","@adonisjs/lucid/orm","@adonisjs/lucid/types/model","@adonisjs/lucid/types/database","luxon"],"treeshake":false,"sourcemaps":false,"fixedExtension":false},"engines":{"node":">=24.0.0"},"exports":{".":"./build/index.js","./types":"./build/src/types.js","./errors":"./build/src/errors.js","./actor_context":"./build/src/actor_context.js","./define_config":"./build/src/define_config.js","./inject_actor_middleware":"./build/src/middleware/inject_actor_middleware.js","./rls_aware_query_builder":"./build/src/rls_aware_query_builder.js","./row_level_security_mixin":"./build/src/row_level_security_mixin.js"},"gitHead":"900e7785ad44e0f1438f35e84acf9e7ac0987380","scripts":{"lint":"eslint .","test":"c8 npm run quick:test","build":"npm run compile","format":"prettier --write .","compile":"tsdown && tsc --emitDeclarationOnly --declaration","pretest":"npm run lint","release":"release-it","version":"npm run build","typecheck":"tsc --noEmit","precompile":"npm run lint","quick:test":"node --import=@poppinss/ts-exec --enable-source-maps bin/test.ts","postcompile":"npm run copy:templates","copy:templates":"copyfiles \"stubs/**/*.stub\" build","prepublishOnly":"npm run build"},"_npmUser":{"name":"n3n","email":"nonpawit.tee@gmail.com"},"prettier":"@adonisjs/prettier-config","release-it":{"git":{"push":true,"tagName":"adonis-rls-v${version}","commitMessage":"chore(adonis-rls): release ${version}","tagAnnotation":"adonis-rls-v${version}","requireUpstream":true,"requireCleanWorkingDir":true},"npm":{"publish":true,"skipChecks":true},"github":{"release":true,"releaseName":"@aginix/adonis-rls ${version}"},"plugins":{"@release-it/conventional-changelog":{"preset":{"name":"angular"}}}},"_npmVersion":"11.8.0","description":"Row-level security for AdonisJS Lucid — scope Model.query() to the current actor by default, with explicit .sudo() escape","directories":{},"_nodeVersion":"24.13.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","luxon":"^3.5.0","eslint":"^10.0.3","tsdown":"^0.21.0","tempura":"^0.4.1","prettier":"^3.8.1","copyfiles":"^2.4.1","cross-env":"^10.1.0","release-it":"^19.2.4","typescript":"^5.9.3","@types/node":"^25.3.5","@japa/assert":"^4.2.0","@japa/runner":"^5.3.0","@types/luxon":"^3.7.1","@adonisjs/core":"^7.0.1","better-sqlite3":"^11.0.0","@adonisjs/lucid":"^22.0.0","@poppinss/hooks":"^7.3.0","@adonisjs/events":"^10.0.0","@adonisjs/logger":"^7.0.0","@poppinss/ts-exec":"^1.4.4","@adonisjs/tsconfig":"^2.0.0","@adonisjs/assembler":"^8.0.0","@adonisjs/eslint-config":"^3.0.0","@adonisjs/prettier-config":"^1.4.5","@release-it/conventional-changelog":"^10.0.5"},"peerDependencies":{"luxon":"^3.0.0","@adonisjs/core":"^7.0.0","@adonisjs/lucid":"^22.0.0","@poppinss/hooks":"^7.3.0","@adonisjs/assembler":"^8.0.0"},"peerDependenciesMeta":{"@adonisjs/assembler":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/adonis-rls_1.0.0_1779010791457_0.8822658612502186","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@aginix/adonis-rls","version":"1.0.1","keywords":["adonisjs","adonis","lucid","rls","row-level-security","authorization","multitenant"],"author":{"name":"n3n"},"license":"MIT","_id":"@aginix/adonis-rls@1.0.1","maintainers":[{"name":"n3n","email":"nonpawit.tee@gmail.com"}],"c8":{"exclude":["tests/**"],"reporter":["text","html"]},"dist":{"shasum":"1c268a1164b5c3ec1dfde777cf57ed0be1ab5b44","tarball":"https://registry.npmjs.org/@aginix/adonis-rls/-/adonis-rls-1.0.1.tgz","fileCount":30,"integrity":"sha512-YHxEH0SoljB+6yS8UD6xDt2lUdw6V7/P8KccwOsP5AuuezWsb9Cqcg6oMtwVin9/np6uUymzcD8IRasutDMGaw==","signatures":[{"sig":"MEUCIQDnplilPTdRgMqSJu+O9nGgaFebrGX9UyDlP4KreJBN/wIgbvwFDGwukalq169tgPYsD16E8/+Iu+cjfqaCElhe9FM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":67750},"main":"build/index.js","type":"module","types":"./build/index.d.ts","tsdown":{"dts":false,"clean":true,"entry":["./index.ts","./configure.ts","./stubs/main.ts","./src/types.ts","./src/errors.ts","./src/actor_context.ts","./src/define_config.ts","./src/rls_marker.ts","./src/scope_runner.ts","./src/preload_patcher.ts","./src/rls_aware_query_builder.ts","./src/row_level_security_mixin.ts","./src/middleware/inject_actor_middleware.ts"],"format":"esm","minify":"dce-only","outDir":"./build","target":"esnext","external":["@adonisjs/core","@adonisjs/core/http","@adonisjs/core/types","@adonisjs/core/types/helpers","@adonisjs/core/types/http","@adonisjs/core/commands/configure","@adonisjs/lucid","@adonisjs/lucid/orm","@adonisjs/lucid/types/model","@adonisjs/lucid/types/database","luxon"],"treeshake":false,"sourcemaps":false,"fixedExtension":false},"engines":{"node":">=24.0.0"},"exports":{".":"./build/index.js","./types":"./build/src/types.js","./errors":"./build/src/errors.js","./actor_context":"./build/src/actor_context.js","./define_config":"./build/src/define_config.js","./inject_actor_middleware":"./build/src/middleware/inject_actor_middleware.js","./rls_aware_query_builder":"./build/src/rls_aware_query_builder.js","./row_level_security_mixin":"./build/src/row_level_security_mixin.js"},"gitHead":"4dcc3fe7067a08c9d2f85d7993f2e5d9c88397fa","scripts":{"lint":"eslint .","test":"c8 npm run quick:test","build":"npm run compile","format":"prettier --write .","compile":"tsdown && tsc --emitDeclarationOnly --declaration","pretest":"npm run lint","release":"release-it","version":"npm run build","typecheck":"tsc --noEmit","precompile":"npm run lint","quick:test":"node --import=@poppinss/ts-exec --enable-source-maps bin/test.ts","postcompile":"npm run copy:templates","copy:templates":"copyfiles \"stubs/**/*.stub\" build","prepublishOnly":"npm run build"},"_npmUser":{"name":"n3n","email":"nonpawit.tee@gmail.com"},"prettier":"@adonisjs/prettier-config","release-it":{"git":{"push":true,"tagName":"adonis-rls-v${version}","commitMessage":"chore(adonis-rls): release ${version}","tagAnnotation":"adonis-rls-v${version}","requireUpstream":true,"requireCleanWorkingDir":true},"npm":{"publish":true,"skipChecks":true},"github":{"release":true,"releaseName":"@aginix/adonis-rls ${version}"},"plugins":{"@release-it/conventional-changelog":{"preset":{"name":"angular"}}}},"_npmVersion":"11.8.0","description":"Row-level security for AdonisJS Lucid — scope Model.query() to the current actor by default, with explicit .sudo() escape","directories":{},"_nodeVersion":"24.13.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","luxon":"^3.5.0","eslint":"^10.0.3","tsdown":"^0.21.0","tempura":"^0.4.1","prettier":"^3.8.1","copyfiles":"^2.4.1","cross-env":"^10.1.0","release-it":"^19.2.4","typescript":"^5.9.3","@types/node":"^25.3.5","@japa/assert":"^4.2.0","@japa/runner":"^5.3.0","@types/luxon":"^3.7.1","@adonisjs/core":"^7.0.1","better-sqlite3":"^11.0.0","@adonisjs/lucid":"^22.0.0","@poppinss/hooks":"^7.3.0","@adonisjs/events":"^10.0.0","@adonisjs/logger":"^7.0.0","@poppinss/ts-exec":"^1.4.4","@adonisjs/tsconfig":"^2.0.0","@adonisjs/assembler":"^8.0.0","@adonisjs/eslint-config":"^3.0.0","@adonisjs/prettier-config":"^1.4.5","@release-it/conventional-changelog":"^10.0.5"},"peerDependencies":{"luxon":"^3.0.0","@adonisjs/core":"^7.0.0","@adonisjs/lucid":"^22.0.0","@poppinss/hooks":"^7.3.0","@adonisjs/assembler":"^8.0.0"},"peerDependenciesMeta":{"@adonisjs/assembler":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/adonis-rls_1.0.1_1779964873486_0.8333206757597387","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@aginix/adonis-rls","version":"1.0.2","keywords":["adonisjs","adonis","lucid","rls","row-level-security","authorization","multitenant"],"author":{"name":"n3n"},"license":"MIT","_id":"@aginix/adonis-rls@1.0.2","maintainers":[{"name":"n3n","email":"nonpawit.tee@gmail.com"}],"c8":{"exclude":["tests/**"],"reporter":["text","html"]},"dist":{"shasum":"8f8a7c81442ff129def3250d76a95cd687e3bb4c","tarball":"https://registry.npmjs.org/@aginix/adonis-rls/-/adonis-rls-1.0.2.tgz","fileCount":32,"integrity":"sha512-hIeJjB0DrXZ8+LFxPF6YolVTDJ1Csg+WVXuQHFrfHiNCOzAhtiUuYfo5f6qo9t+4tq8e5MzJyJSRHtpNMdaIXg==","signatures":[{"sig":"MEUCIQCOKOUaMwolsPpYy6jQgi+AVTVV1FGx783XHJL5llXJKAIgB8csW4IKBDDuAN28//IgjawcTbp7x9AfIsrFkgwK5ZA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":70764},"main":"build/index.js","type":"module","types":"./build/index.d.ts","tsdown":{"dts":false,"clean":true,"entry":["./index.ts","./configure.ts","./stubs/main.ts","./src/types.ts","./src/errors.ts","./src/actor_context.ts","./src/define_config.ts","./src/rls_marker.ts","./src/scope_runner.ts","./src/preload_patcher.ts","./src/rls_aware_query_builder.ts","./src/row_level_security_mixin.ts","./src/middleware/inject_actor_middleware.ts","./src/providers/rls_provider.ts"],"format":"esm","minify":"dce-only","outDir":"./build","target":"esnext","external":["@adonisjs/core","@adonisjs/core/http","@adonisjs/core/types","@adonisjs/core/types/helpers","@adonisjs/core/types/http","@adonisjs/core/commands/configure","@adonisjs/lucid","@adonisjs/lucid/orm","@adonisjs/lucid/types/model","@adonisjs/lucid/types/database","luxon"],"treeshake":false,"sourcemaps":false,"fixedExtension":false},"engines":{"node":">=24.0.0"},"exports":{".":"./build/index.js","./types":"./build/src/types.js","./errors":"./build/src/errors.js","./actor_context":"./build/src/actor_context.js","./define_config":"./build/src/define_config.js","./providers/rls_provider":"./build/src/providers/rls_provider.js","./inject_actor_middleware":"./build/src/middleware/inject_actor_middleware.js","./rls_aware_query_builder":"./build/src/rls_aware_query_builder.js","./row_level_security_mixin":"./build/src/row_level_security_mixin.js"},"gitHead":"d4e3b4c1ead22c5baea0dbfe6e3d323d9a180477","scripts":{"lint":"eslint .","test":"c8 npm run quick:test","build":"npm run compile","format":"prettier --write .","compile":"tsdown && tsc --emitDeclarationOnly --declaration","pretest":"npm run lint","release":"release-it","version":"npm run build","typecheck":"tsc --noEmit","precompile":"npm run lint","quick:test":"node --import=@poppinss/ts-exec --enable-source-maps bin/test.ts","postcompile":"npm run copy:templates","copy:templates":"copyfiles \"stubs/**/*.stub\" build","prepublishOnly":"npm run build"},"_npmUser":{"name":"n3n","email":"nonpawit.tee@gmail.com"},"prettier":"@adonisjs/prettier-config","release-it":{"git":{"push":true,"tagName":"adonis-rls-v${version}","commitMessage":"chore(adonis-rls): release ${version}","tagAnnotation":"adonis-rls-v${version}","requireUpstream":true,"requireCleanWorkingDir":true},"npm":{"publish":true,"skipChecks":true},"github":{"release":true,"releaseName":"@aginix/adonis-rls ${version}"},"plugins":{"@release-it/conventional-changelog":{"preset":{"name":"angular"}}}},"_npmVersion":"11.8.0","description":"Row-level security for AdonisJS Lucid — scope Model.query() to the current actor by default, with explicit .sudo() escape","directories":{},"_nodeVersion":"24.13.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","luxon":"^3.5.0","eslint":"^10.0.3","tsdown":"^0.21.0","tempura":"^0.4.1","prettier":"^3.8.1","copyfiles":"^2.4.1","cross-env":"^10.1.0","release-it":"^19.2.4","typescript":"^5.9.3","@types/node":"^25.3.5","@japa/assert":"^4.2.0","@japa/runner":"^5.3.0","@types/luxon":"^3.7.1","@adonisjs/core":"^7.0.1","better-sqlite3":"^11.0.0","@adonisjs/lucid":"^22.0.0","@poppinss/hooks":"^7.3.0","@adonisjs/events":"^10.0.0","@adonisjs/logger":"^7.0.0","@poppinss/ts-exec":"^1.4.4","@adonisjs/tsconfig":"^2.0.0","@adonisjs/assembler":"^8.0.0","@adonisjs/eslint-config":"^3.0.0","@adonisjs/prettier-config":"^1.4.5","@release-it/conventional-changelog":"^10.0.5"},"peerDependencies":{"luxon":"^3.0.0","@adonisjs/core":"^7.0.0","@adonisjs/lucid":"^22.0.0","@poppinss/hooks":"^7.3.0","@adonisjs/assembler":"^8.0.0"},"peerDependenciesMeta":{"@adonisjs/assembler":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/adonis-rls_1.0.2_1782119939217_0.08763310893539433","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"@aginix/adonis-rls","version":"1.0.3","keywords":["adonisjs","adonis","lucid","rls","row-level-security","authorization","multitenant"],"author":{"name":"n3n"},"license":"MIT","_id":"@aginix/adonis-rls@1.0.3","maintainers":[{"name":"n3n","email":"nonpawit.tee@gmail.com"}],"homepage":"https://github.com/Aginix/adonis-vulcan/tree/main/packages/adonis-rls#readme","bugs":{"url":"https://github.com/Aginix/adonis-vulcan/issues"},"c8":{"exclude":["tests/**"],"reporter":["text","html"]},"dist":{"shasum":"0229d95b063bac9c42cf82601cd4d842e9bb713e","tarball":"https://registry.npmjs.org/@aginix/adonis-rls/-/adonis-rls-1.0.3.tgz","fileCount":32,"integrity":"sha512-wg9uiqNgSn0DoLDR5EiDxsydttYpYbCL4FAFAGGMnfYcEApQ66Mn/JDxX/YQRbLZ7QWfvhKX2c0v+8FxQgZLTQ==","signatures":[{"sig":"MEUCIQCdWfO9Wy0MtLAnAzytMnHsuvN84EDGp4XU2OxMBIy/nAIgCB4L9fB84DNYYe2Q6yKIhV+CKa6xuDvWuVjKVXwVQ/c=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":72975},"main":"build/index.js","type":"module","types":"./build/index.d.ts","tsdown":{"dts":false,"clean":true,"entry":["./index.ts","./configure.ts","./stubs/main.ts","./src/types.ts","./src/errors.ts","./src/actor_context.ts","./src/define_config.ts","./src/rls_marker.ts","./src/scope_runner.ts","./src/preload_patcher.ts","./src/rls_aware_query_builder.ts","./src/row_level_security_mixin.ts","./src/middleware/inject_actor_middleware.ts","./src/providers/rls_provider.ts"],"format":"esm","minify":"dce-only","outDir":"./build","target":"esnext","external":["@adonisjs/core","@adonisjs/core/http","@adonisjs/core/types","@adonisjs/core/types/helpers","@adonisjs/core/types/http","@adonisjs/core/commands/configure","@adonisjs/lucid","@adonisjs/lucid/orm","@adonisjs/lucid/types/model","@adonisjs/lucid/types/database","luxon"],"treeshake":false,"sourcemaps":false,"fixedExtension":false},"engines":{"node":">=24.0.0"},"exports":{".":"./build/index.js","./types":"./build/src/types.js","./errors":"./build/src/errors.js","./actor_context":"./build/src/actor_context.js","./define_config":"./build/src/define_config.js","./providers/rls_provider":"./build/src/providers/rls_provider.js","./inject_actor_middleware":"./build/src/middleware/inject_actor_middleware.js","./rls_aware_query_builder":"./build/src/rls_aware_query_builder.js","./row_level_security_mixin":"./build/src/row_level_security_mixin.js"},"gitHead":"6cf720ac3ce586268de61195713785f4b9a76b5d","scripts":{"lint":"eslint .","test":"c8 npm run quick:test","build":"npm run compile","format":"prettier --write .","compile":"tsdown && tsc --emitDeclarationOnly --declaration","pretest":"npm run lint","release":"release-it","version":"npm run build","typecheck":"tsc --noEmit","precompile":"npm run lint","quick:test":"node --import=@poppinss/ts-exec --enable-source-maps bin/test.ts","postcompile":"npm run copy:templates","copy:templates":"copyfiles \"stubs/**/*.stub\" build","prepublishOnly":"npm run build"},"_npmUser":{"name":"n3n","email":"nonpawit.tee@gmail.com"},"prettier":"@adonisjs/prettier-config","release-it":{"git":{"push":true,"tagName":"adonis-rls-v${version}","commitMessage":"chore(adonis-rls): release ${version}","tagAnnotation":"adonis-rls-v${version}","requireUpstream":true,"requireCleanWorkingDir":true},"npm":{"publish":true,"skipChecks":true},"github":{"release":true,"releaseName":"@aginix/adonis-rls ${version}"},"plugins":{"@release-it/conventional-changelog":{"preset":{"name":"angular"}}}},"repository":{"url":"git+https://github.com/Aginix/adonis-vulcan.git","type":"git","directory":"packages/adonis-rls"},"_npmVersion":"11.8.0","description":"Row-level security for AdonisJS Lucid — scope Model.query() to the current actor by default, with explicit .sudo() escape","directories":{},"_nodeVersion":"24.13.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","luxon":"^3.5.0","eslint":"^10.0.3","tsdown":"^0.21.0","tempura":"^0.4.1","prettier":"^3.8.1","copyfiles":"^2.4.1","cross-env":"^10.1.0","release-it":"^19.2.4","typescript":"^5.9.3","@types/node":"^25.3.5","@japa/assert":"^4.2.0","@japa/runner":"^5.3.0","@types/luxon":"^3.7.1","@adonisjs/core":"^7.0.1","better-sqlite3":"^11.0.0","@adonisjs/lucid":"^22.0.0","@poppinss/hooks":"^7.3.0","@adonisjs/events":"^10.0.0","@adonisjs/logger":"^7.0.0","@poppinss/ts-exec":"^1.4.4","@adonisjs/tsconfig":"^2.0.0","@adonisjs/assembler":"^8.0.0","@adonisjs/eslint-config":"^3.0.0","@adonisjs/prettier-config":"^1.4.5","@release-it/conventional-changelog":"^10.0.5"},"peerDependencies":{"luxon":"^3.0.0","@adonisjs/core":"^7.0.0","@adonisjs/lucid":"^22.0.0","@poppinss/hooks":"^7.3.0","@adonisjs/assembler":"^8.0.0"},"peerDependenciesMeta":{"@adonisjs/assembler":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/adonis-rls_1.0.3_1782181174506_0.7900371776936488","host":"s3://npm-registry-packages-npm-production"}},"1.0.4":{"name":"@aginix/adonis-rls","description":"Row-level security for AdonisJS Lucid — scope Model.query() to the current actor by default, with explicit .sudo() escape","version":"1.0.4","engines":{"node":">=24.0.0"},"type":"module","main":"build/index.js","exports":{".":"./build/index.js","./types":"./build/src/types.js","./errors":"./build/src/errors.js","./actor_context":"./build/src/actor_context.js","./define_config":"./build/src/define_config.js","./row_level_security_mixin":"./build/src/row_level_security_mixin.js","./rls_aware_query_builder":"./build/src/rls_aware_query_builder.js","./inject_actor_middleware":"./build/src/middleware/inject_actor_middleware.js","./providers/rls_provider":"./build/src/providers/rls_provider.js"},"scripts":{"copy:templates":"copyfiles \"stubs/**/*.stub\" build","typecheck":"tsc --noEmit","lint":"eslint .","format":"prettier --write .","quick:test":"node --import=@poppinss/ts-exec --enable-source-maps bin/test.ts","pretest":"npm run lint","test":"c8 npm run quick:test","precompile":"npm run lint","compile":"tsdown && tsc --emitDeclarationOnly --declaration","postcompile":"npm run copy:templates","build":"npm run compile","release":"release-it","version":"npm run build","prepublishOnly":"npm run build"},"keywords":["adonisjs","adonis","lucid","rls","row-level-security","authorization","multitenant"],"author":{"name":"n3n"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/Aginix/adonis-vulcan.git","directory":"packages/adonis-rls"},"bugs":{"url":"https://github.com/Aginix/adonis-vulcan/issues"},"homepage":"https://github.com/Aginix/adonis-vulcan/tree/main/packages/adonis-rls#readme","devDependencies":{"@adonisjs/assembler":"^8.0.0","@adonisjs/core":"^7.0.1","@adonisjs/eslint-config":"^3.0.0","@adonisjs/events":"^10.0.0","@adonisjs/logger":"^7.0.0","@adonisjs/lucid":"^22.0.0","@adonisjs/prettier-config":"^1.4.5","@adonisjs/tsconfig":"^2.0.0","@japa/assert":"^4.2.0","@japa/runner":"^5.3.0","@poppinss/hooks":"^7.3.0","@poppinss/ts-exec":"^1.4.4","@release-it/conventional-changelog":"^10.0.5","@types/luxon":"^3.7.1","@types/node":"^25.3.5","better-sqlite3":"^11.0.0","c8":"^11.0.0","copyfiles":"^2.4.1","cross-env":"^10.1.0","eslint":"^10.0.3","luxon":"^3.5.0","prettier":"^3.8.1","release-it":"^19.2.4","tempura":"^0.4.1","tsdown":"^0.21.0","typescript":"^5.9.3"},"peerDependencies":{"@adonisjs/core":"^7.0.0","@adonisjs/lucid":"^22.0.0","@adonisjs/assembler":"^8.0.0","@poppinss/hooks":"^7.3.0","luxon":"^3.0.0"},"peerDependenciesMeta":{"@adonisjs/assembler":{"optional":true}},"publishConfig":{"access":"public"},"tsdown":{"entry":["./index.ts","./configure.ts","./stubs/main.ts","./src/types.ts","./src/errors.ts","./src/actor_context.ts","./src/define_config.ts","./src/scope_runner.ts","./src/preload_patcher.ts","./src/rls_aware_query_builder.ts","./src/row_level_security_mixin.ts","./src/middleware/inject_actor_middleware.ts","./src/providers/rls_provider.ts"],"outDir":"./build","clean":true,"format":"esm","minify":"dce-only","fixedExtension":false,"dts":false,"treeshake":false,"sourcemaps":false,"target":"esnext","external":["@adonisjs/core","@adonisjs/core/http","@adonisjs/core/types","@adonisjs/core/types/helpers","@adonisjs/core/types/http","@adonisjs/core/commands/configure","@adonisjs/lucid","@adonisjs/lucid/orm","@adonisjs/lucid/types/model","@adonisjs/lucid/types/database","luxon"]},"release-it":{"git":{"requireCleanWorkingDir":true,"requireUpstream":true,"commitMessage":"chore(adonis-rls): release ${version}","tagAnnotation":"adonis-rls-v${version}","push":true,"tagName":"adonis-rls-v${version}"},"github":{"release":true,"releaseName":"@aginix/adonis-rls ${version}"},"npm":{"publish":true,"skipChecks":true},"plugins":{"@release-it/conventional-changelog":{"preset":{"name":"angular"}}}},"c8":{"reporter":["text","html"],"exclude":["tests/**"]},"prettier":"@adonisjs/prettier-config","gitHead":"b09ab63fd10c606502ae961b6b5a98b23e5a0ddb","types":"./build/index.d.ts","_id":"@aginix/adonis-rls@1.0.4","_nodeVersion":"24.13.1","_npmVersion":"11.8.0","dist":{"integrity":"sha512-6BcDiMsgpvHt/+OD6AiEZ8HRx3UsTjrORrwHxwOas6Jsoz1iEGq90fhzR27N5BeAp0rO3HBJptqkdBW+V+D8LA==","shasum":"be5ec0716ed03cf587ab96bd0b4cbb3e4f171fb1","tarball":"https://registry.npmjs.org/@aginix/adonis-rls/-/adonis-rls-1.0.4.tgz","fileCount":30,"unpackedSize":72638,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIETv3NoQ+0HR67IMbfkeVvRtmWXSGNy8HxguU/fyYbuJAiAYQJOQrZ+Ig8Cn8LRMy31sBgoTpCcY12VO2+oAEgAnZg=="}]},"_npmUser":{"name":"n3n","email":"nonpawit.tee@gmail.com"},"directories":{},"maintainers":[{"name":"n3n","email":"nonpawit.tee@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/adonis-rls_1.0.4_1784224055223_0.885866698705672"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-17T09:39:51.392Z","modified":"2026-07-16T17:47:35.507Z","1.0.0":"2026-05-17T09:39:51.611Z","1.0.1":"2026-05-28T10:41:13.651Z","1.0.2":"2026-06-22T09:18:59.355Z","1.0.3":"2026-06-23T02:19:34.643Z","1.0.4":"2026-07-16T17:47:35.360Z"},"bugs":{"url":"https://github.com/Aginix/adonis-vulcan/issues"},"author":{"name":"n3n"},"license":"MIT","homepage":"https://github.com/Aginix/adonis-vulcan/tree/main/packages/adonis-rls#readme","keywords":["adonisjs","adonis","lucid","rls","row-level-security","authorization","multitenant"],"repository":{"type":"git","url":"git+https://github.com/Aginix/adonis-vulcan.git","directory":"packages/adonis-rls"},"description":"Row-level security for AdonisJS Lucid — scope Model.query() to the current actor by default, with explicit .sudo() escape","maintainers":[{"name":"n3n","email":"nonpawit.tee@gmail.com"}],"readme":"# @aginix/adonis-rls\n\nRow-level security for AdonisJS Lucid. `Model.query()` is scoped to the current actor by default — there's no opt-in step beyond composing one mixin and declaring a `rlsScope`. Bypass is explicit and named (`.sudo()`, optionally with a reason for audit hooks).\n\n> Status: **v0.1 beta**. API surface is design-locked but the package has not been deployed against a production database. Use behind a feature flag if you adopt it before 0.2.\n\n## Install\n\n```sh\npnpm add @aginix/adonis-rls\nnode ace configure @aginix/adonis-rls\n```\n\nThe configure hook publishes `config/rls.ts` and registers `inject_actor_middleware` on the router.\n\n## 1. Make a model RLS-aware\n\n```ts\n// app/models/article.ts\nimport { compose } from '@adonisjs/core/helpers'\nimport { BaseModel, column } from '@adonisjs/lucid/orm'\nimport { RowLevelSecurity, type RlsContext } from '@aginix/adonis-rls'\nimport type { ModelQueryBuilderContract } from '@adonisjs/lucid/types/model'\nimport User from '#models/user'\n\nexport default class Article extends compose(BaseModel, RowLevelSecurity) {\n  @column({ isPrimary: true })\n  declare id: number\n\n  @column()\n  declare authorId: number\n\n  @column()\n  declare visibility: 'public' | 'private'\n\n  static rlsScope(\n    query: ModelQueryBuilderContract<typeof Article>,\n    ctx: RlsContext<User>\n  ) {\n    const user = ctx.actor\n    if (!user) return query.where('visibility', 'public') // anonymous\n    if (user.role === 'admin') return query                // admin sees all\n    return query.where((q) => {\n      q.where('author_id', user.id).orWhere('visibility', 'public')\n    })\n  }\n}\n```\n\nThat's it. Every read goes through `rlsScope` automatically — `Article.query()`, `Article.find(id)`, `Article.findOrFail(id)`, `Article.query().paginate(...)`, `Article.query().preload('comments')`.\n\nRLS is a **read** concern. Writes — `Model.query().update()` / `.delete()` / `.increment()` / `.decrement()`, and model instance `save()` / `delete()` — are **not** scoped. Authorizing a write (\"can this actor modify this row?\") is a separate concern: use Bouncer, or scope the write explicitly with `.where(...)`.\n\n## 2. Run inside an actor context\n\nInside an HTTP handler, the middleware does this for you:\n\n```ts\n// HTTP handler — actor auto-injected via ctx.auth.user\nawait Article.query()       // scoped to ctx.auth.user\nawait Article.find(42)      // null if user can't see id=42\n```\n\nOutside HTTP (jobs, seeders, CLI), be explicit:\n\n```ts\nimport { runWithActor } from '@aginix/adonis-rls'\n\nawait runWithActor(systemUser, async () => {\n  await Article.query()\n})\n\n// or via the static helper:\nawait Article.forActor(systemUser)\n```\n\n## 3. Bypass (when you really need to)\n\n```ts\nawait Article.sudo('payroll job: monthly summary')   // with a reason (recommended)\nawait Article.sudo()                                  // no reason -- fine for obvious call sites\nawait Article.query().sudo('admin export').where('status', 'archived')\n```\n\n`reason` is optional. When passed, it's preserved on the builder state for an upcoming audit layer; pass one whenever the call site isn't self-explanatory.\n\n## 4. Preload cascades\n\n`.preload('comments')` runs Comment's `rlsScope` automatically:\n\n```ts\n// Both Article and Comment have rlsScope. Both run.\nawait Article.query().preload('comments')\n\n// Compose with user clauses inside the callback\nawait Article.query().preload('comments', (q) => q.where('approved', true))\n\n// Mix scopes across the tree\nawait Article.sudo('admin export').preload('comments', (q) => q.forActor(viewer))\n```\n\n## 5. Config\n\n```ts\n// config/rls.ts\nimport { defineConfig } from '@aginix/adonis-rls'\n\nexport default defineConfig({\n  // What happens when Model.query() runs without an actor (no middleware,\n  // no .forActor, no .sudo). 'throw' (default) is safest. 'deny' returns\n  // no rows. 'allow' skips the scope entirely — only opt in if you have\n  // another authz layer.\n  defaultBehavior: 'throw',\n\n  // How to resolve the actor from HttpContext. Default reads ctx.auth?.user.\n  // Override here if your auth shape is different. May be sync or async —\n  // the middleware awaits the result, so you can do ctx.auth.check(),\n  // verify a JWT, hit a session store, etc.\n  // actorResolver: async (ctx) => {\n  //   await ctx.auth.check()\n  //   return ctx.auth.user ?? null\n  // },\n})\n```\n\n## Writes are not scoped\n\nRLS scopes reads only. Writes go through untouched:\n\n```ts\nawait runWithActor(user, async () => {\n  // NOT filtered by rlsScope — updates every matching row, including\n  // ones `user` cannot read. Scope it yourself if you need to.\n  await Article.query().where('id', 7).update({ status: 'archived' })\n\n  // Instance save()/delete() persist regardless of the actor's scope.\n  const row = await Article.findOrFail(7) // read IS scoped\n  row.status = 'archived'\n  await row.save()                        // write is NOT scoped\n})\n```\n\nAuthorize writes with Bouncer (endpoint / action level) or an explicit\n`.where(...)` on the query. RLS deliberately stays out of the write path.\n\n## Errors\n\n| Class                      | When                                                                                  |\n| -------------------------- | ------------------------------------------------------------------------------------- |\n| `MissingActorError`        | `Model.query()` ran with no actor and `defaultBehavior: 'throw'`.                     |\n| `RlsScopeNotDefinedError`  | Model composes `RowLevelSecurity` but doesn't declare `static rlsScope`.              |\n\n## Composing with other packages\n\n| Package                   | How                                                                                     |\n| ------------------------- | --------------------------------------------------------------------------------------- |\n| `@aginix/adonis-vulcan`   | `Model.query().filter(qs)` — RLS applies first, vulcan's filter clauses AND on top.    |\n| `@aginix/adonis-object-id`| `Article.findByObjectId(ref)` — routes through `query()`, so RLS hides invisible rows. |\n| `BaseResourceController`  | All five actions are RLS-scoped automatically when the model uses the mixin.            |\n| Bouncer                   | Complementary — Bouncer gates endpoints, RLS gates rows. Use both.                      |\n\n## Limitations (v0.1)\n\n- In-app TypeScript only; no Postgres-native `CREATE POLICY` layer (planned).\n- Row-level only; column-level visibility belongs to a future serializer/transformer concern.\n- Writes are not scoped at all — `create`, mass `update`/`delete`, and instance `save()`/`delete()` all bypass `rlsScope`. RLS covers row *visibility* (reads); write authorization is delegated to Bouncer / explicit `.where(...)`.\n- Single actor type per app (`config.actorResolver` returns one shape).\n- Pivot tables in `manyToMany` preloads are not scoped — only the related model is.\n\n## License\n\nMIT\n","readmeFilename":"README.md"}