{"_id":"@cerbos/orm-prisma","_rev":"20-d5175bdf9aa7fc9f16f9be718541e913","name":"@cerbos/orm-prisma","dist-tags":{"latest":"4.1.0"},"versions":{"0.1.1":{"name":"@cerbos/orm-prisma","version":"0.1.1","author":{"name":"Cerbos"},"license":"Apache-2.0","_id":"@cerbos/orm-prisma@0.1.1","maintainers":[{"name":"ahaines","email":"andrew@haines.org.nz"},{"name":"alexolivier","email":"alex@alexolivier.me"}],"homepage":"https://cerbos.dev","dist":{"shasum":"7a81c8d07be5c14c489c56311e414482fece4161","tarball":"https://registry.npmjs.org/@cerbos/orm-prisma/-/orm-prisma-0.1.1.tgz","fileCount":7,"integrity":"sha512-qj6slHkdmERR05pNx9T0a4UPmmCqCqLFifiysNsZeJwd6l0P2Rq7E4dPGsvkLHrxxYkcI5D/zOHyRy4MqtahFg==","signatures":[{"sig":"MEQCIBeo5F3wyTSikuZy6wyVWd92QKldWlFwYkr0VMdzntEIAiAITDigyUon1sSz/vCNzuydKhI6utf8THqb+JhkFsUmZA==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":10405,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiqbUIACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpXbw/+KEDUHDm0u6HQtx6IUr8PT+1JYo6XdFluFYuXguYxxdMwkP+h\r\n1KwgXV1hNrsuIyz7sIyGNAc7YDcpkNRhVytp4ASVVqvwtvB+TJoDuAa6fvt4\r\nNEIi28WWI+8c9PzqZKPQitjwekLhAfEldsKaPLn8I8hTDiQxeW/01p2sGRBx\r\nXOHKz/lC1oqBCpJpI7WaJmSYs1UCfiFhMRE910xqALUXZFggq7f1RogBY1KY\r\np61+2Razb/2hoRSdNmDSNzCuO6DsS6FG07O5Ltfx8FPGbZdKUtJHq44af856\r\niOmWa1eZjkuriM3KIUnGDjy8BSuQlfY1ErZuDzgYYsQHOsPcPzsm925UneJj\r\nD1o6HDFKOQxGkmSutldzbWRI4oRvInNZWNwlIkHpoKBjCZLzfHII5upJN8v7\r\n/kEiQ5xsc2zshoQLaxxxORSQp/v+FP4Xy+PmETFrBNZIzgsMh+oG6InTMuhh\r\n9hoEzNKtRIu8YDrzjxahcN9WCCRsnzGFbZa1jxDZ75PXQSN0vbsBOTBUDlVQ\r\nNSlRO+vQV0Jrce9+VhiIkKKX9bM4rLy6P834y9qiGxPOfuEYsYOmEwFlhVvr\r\nK3NmN55598Ji2r22CNQYZf7eAHC6q3areIzO0wyAtwCAKYsB1U3cC9RvmHJ0\r\nFkMKHbmh1dubgJpOTg954FOF/4TMm+83TAY=\r\n=eAzT\r\n-----END PGP SIGNATURE-----\r\n"},"main":"./lib/cjs/index.js","types":"./lib/cjs/index.d.ts","module":"./lib/esm/index.js","gitHead":"e7988e6039c5d0d193f2c474dcd6fe147683fa04","private":false,"scripts":{"build":"tsc -p tsconfig.json && tsc -p tsconfig-cjs.json","prepare":"npm run build","version":"git add -A src","preversion":"npm run lint","postversion":"git push && git push --tags"},"_npmUser":{"name":"alexolivier","email":"alex@alexolivier.me"},"_npmVersion":"8.11.0","description":"An adapater library that takes a [Cerbos](https://cerbos.dev) Query Plan ([PlanResources API](https://docs.cerbos.dev/cerbos/latest/api/index.html#resources-query-plan)) response and converts it into a [Prisma](https://prisma.io) where class object. This ","directories":{},"_nodeVersion":"18.3.0","dependencies":{"@cerbos/core":"^0.5.0"},"_hasShrinkwrap":false,"devDependencies":{"ts-node":"^10.4.0","typescript":"^4.5.4"},"_npmOperationalInternal":{"tmp":"tmp/orm-prisma_0.1.1_1655289096177_0.39855441435956274","host":"s3://npm-registry-packages"}},"0.1.2":{"name":"@cerbos/orm-prisma","version":"0.1.2","author":{"name":"Cerbos"},"license":"Apache-2.0","_id":"@cerbos/orm-prisma@0.1.2","maintainers":[{"name":"ahaines","email":"andrew@haines.org.nz"},{"name":"alexolivier","email":"alex@alexolivier.me"}],"homepage":"https://cerbos.dev","dist":{"shasum":"de35eebcb1e69bd477fd42f3ce91ebb6aa88d98a","tarball":"https://registry.npmjs.org/@cerbos/orm-prisma/-/orm-prisma-0.1.2.tgz","fileCount":11,"integrity":"sha512-A0vKkg866/rQVJhXDsxAbLbuK9fi2Wyi+/mbYG3TIows3eGs1JdHEqWppZi0DecXfU2OT+AIyJFPxkxDSU59LA==","signatures":[{"sig":"MEUCICxtTNg3xmQ541jid0t0/GzTT5cFofk6TcbyGSi10jp8AiEApUeCDxUKnv4uq2skQFnT75n62klFwSAj3zJa0EWlayI=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":27529,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjGK4yACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoFGA//aw4U8RC7I74jgj8lX268VDs4x3OFyCUTNKut4evRUakL9Mcu\r\n7ph480+XIUvhBC8kqEeWIaMNHWcK7K/oa7uK4FV5f6BE8lWzB2rqP/LILML+\r\nkOI+TPFY7dTjR5IQK9Bi6b3OkXzzZgo/2X4tZ1U9cCw6QNnnTvzJPYSr2OpQ\r\ndcQo9O9voC5Fg1l8TfvKSaGuOyY8s5sSmJIiukm/yL5H0nlugIVnypXDerEI\r\neWLxMyv/lI/UdoGcJ3gJ6tClc9oyRjhreyD5hWLugxNWh1lPXtRAYQsFsnHi\r\nbF3jrtee36cjsTUOQhz4GTMpwwPsvL763PBuNxeGSK90inMZ6ZylYBDR93qs\r\n8IsNZxNyfXcTqUVjp25tQABqokg3Bf5WrYi6aTz53ovK/L/Czb8ivD2V0wAm\r\nYoap4HN1wF/nTqy39AEJm5QBGci2Wyr3T4TTdelh4C2QvWrdLb1JEjlwiE/w\r\nWE1pPczq/X7yDZpVXEVIxyoMR1jdAjCTDU24PmfgriiLPmDo8UqEh9P+89LO\r\n6pbSpx/EoqbAs+BTTXT9SSAUkM+4De+8IDB0PxA7u7YqfR30txKENeytbBTQ\r\nVOpaKSdhNVF+Maoxl9EQjS2mOvidhRke6KavPousGxrjcs37M0BJzBXH0Git\r\nxPejv6AtPMTZXBWbMzVqCvlqsENVXe1TPaU=\r\n=HEzS\r\n-----END PGP SIGNATURE-----\r\n"},"main":"./lib/cjs/index.js","types":"./lib/cjs/index.d.ts","module":"./lib/esm/index.js","gitHead":"cb7b6b380f446a09efb7a1b52174335aef6fff8f","private":false,"scripts":{"test":"jest src/**.test.ts","build":"tsc -p tsconfig.json && tsc -p tsconfig-cjs.json","prepare":"npm run build","version":"git add -A src","preversion":"npm run lint","postversion":"git push && git push --tags"},"_npmUser":{"name":"alexolivier","email":"alex@alexolivier.me"},"_npmVersion":"8.11.0","description":"An adapater library that takes a [Cerbos](https://cerbos.dev) Query Plan ([PlanResources API](https://docs.cerbos.dev/cerbos/latest/api/index.html#resources-query-plan)) response and converts it into a [Prisma](https://prisma.io) where class object. This ","directories":{},"_nodeVersion":"18.3.0","dependencies":{"@cerbos/core":"^0.5.1"},"_hasShrinkwrap":false,"devDependencies":{"ts-jest":"^28.0.8","ts-node":"^10.4.0","typescript":"^4.5.4","@types/jest":"^29.0.0"},"_npmOperationalInternal":{"tmp":"tmp/orm-prisma_0.1.2_1662561841866_0.27127648705558793","host":"s3://npm-registry-packages"}},"0.1.4":{"name":"@cerbos/orm-prisma","version":"0.1.4","author":{"name":"Cerbos"},"license":"Apache-2.0","_id":"@cerbos/orm-prisma@0.1.4","maintainers":[{"name":"ahaines","email":"andrew@haines.org.nz"},{"name":"alexolivier","email":"alex@alexolivier.me"}],"homepage":"https://cerbos.dev","dist":{"shasum":"08358f44909b48fee2e9457d42c4f9ff7fbaa151","tarball":"https://registry.npmjs.org/@cerbos/orm-prisma/-/orm-prisma-0.1.4.tgz","fileCount":6,"integrity":"sha512-9DCNj2vJVdYhX73aWj/XGkUkae8uP+WV6+hc3ijm1X7LpAMemGvYKR2Zt+bww5/DUSc7Iu9XpgI672GUlc11Ww==","signatures":[{"sig":"MEQCIGQjRdojoCkz2u50cCjxT/qLND6lJjJkrLBHNtwUpbBEAiBwwUwkW2/e0aXEz660SAllX1iP9pi1buYIFBpu2diV/g==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":9840,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjMX2BACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrOtRAAgcE7YtJOU7pGVzCnZSnzHErjkLyn3jAVHip/aDsfKTlIEhgA\r\nvqe8Y/pNKqJXjluI0qMghpiPjvVyhCiP1TJ1nwFdgXxhwZwWiRLkjj/SKDwm\r\nzPiPjIG3JpwHvKuU8x3ARFn60hd89bWfz4YEg8mR4qm10ceEDUpTJ8PQaGc0\r\niwDAOQFEpver4Ioe5OL3Dr4zbkm3C+BIVTh00DmOYEtfKrLFkGvdXbwajOpi\r\nnWJxe0LnNhuzqkqmBJHQQcUXrVxCMPzn09YyJfXeBe64VU2gEgvIHlMDIaU7\r\nIqvPosjVsLnOAT0BbtGRAxIgtPa/OStKAiinTrfSsQxmNS2F+h50xZ4/PuK7\r\n1Rubzea3xvyMOwUS8Vnn2XDZfddBbV4Skyk8RPp2x9N9OgezfH7ygOXotEVZ\r\nKoHq6cpBaeEY6o/a658ag2BgMm0azr690BZmGYKEn94iwlIB55bw8oCspieJ\r\nAaQCyrh6vS1zA1PERORV3gsglDC+/NINXZI3bXzdOKf2E/1KsC90jKGu4bQs\r\nPRurSmo0HA9/9KLlJLgaTEgTFR+EXGGayW/Vs0tFOcR1l97ItI6CGxDe01e/\r\nhLjZxIw23XR9ML0drsTnJmRNk6CQkEIuG3KSchc7dfU3i9Rxt9evZ2g+cHjV\r\nvOIe7yTUk08wRHRvLUPS8Mfwi5pg86giYRU=\r\n=2+1b\r\n-----END PGP SIGNATURE-----\r\n"},"main":"./lib/cjs/index.js","types":"./lib/cjs/index.d.ts","module":"./lib/esm/index.js","gitHead":"9b53d76c8c263af5a4d114eae5c4f47de3243f13","private":false,"scripts":{"test":"npx prisma db push --force-reset && cerbos run --log-level=error --set=storage.disk.directory=../policies --set=telemetry.disabled=true -- jest src/**.test.ts","build":"tsc -p tsconfig.json && tsc -p tsconfig-cjs.json","cerbos":"cerbos server --config=./cerbos-config.yaml","prepare":"npm run build","version":"git add -A src","preversion":"npm run lint","postversion":"git push && git push --tags"},"_npmUser":{"name":"alexolivier","email":"alex@alexolivier.me"},"_npmVersion":"8.11.0","description":"An adapater library that takes a [Cerbos](https://cerbos.dev) Query Plan ([PlanResources API](https://docs.cerbos.dev/cerbos/latest/api/index.html#resources-query-plan)) response and converts it into a [Prisma](https://prisma.io) where class object. This ","directories":{},"_nodeVersion":"18.3.0","dependencies":{"@cerbos/core":"^0.5.1","@cerbos/grpc":"^0.8.0"},"_hasShrinkwrap":false,"devDependencies":{"prisma":"^4.3.1","ts-jest":"^28.0.8","ts-node":"^10.4.0","typescript":"^4.5.4","@types/jest":"^29.0.3","@types/node":"^18.7.21","@prisma/client":"^4.3.1"},"_npmOperationalInternal":{"tmp":"tmp/orm-prisma_0.1.4_1664187777577_0.6606238493008683","host":"s3://npm-registry-packages"}},"1.0.0-alpha.0":{"name":"@cerbos/orm-prisma","version":"1.0.0-alpha.0","author":{"name":"Cerbos"},"license":"Apache-2.0","_id":"@cerbos/orm-prisma@1.0.0-alpha.0","maintainers":[{"name":"ahaines","email":"andrew@haines.org.nz"},{"name":"alexolivier","email":"alex@alexolivier.me"}],"homepage":"https://cerbos.dev","dist":{"shasum":"095b83567bcf32323d43a41e9299900d8594b350","tarball":"https://registry.npmjs.org/@cerbos/orm-prisma/-/orm-prisma-1.0.0-alpha.0.tgz","fileCount":6,"integrity":"sha512-SnIqBmKlP2f06Li/NrdHGos2HRjMj39uafD09EEvs4VO6Lg0qG9XrMFcMheG4i3jb2zxXNuThzOoqvbOmt9LrA==","signatures":[{"sig":"MEYCIQDDSwhDZFy7+OQFJS3F9xq2QLWw4AL4faQK6+oj5gnf9AIhAONPMbvKy0rsh51WRNp5+ClXqtoDolEfhkafkmOxMikG","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":16187,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjMbUUACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoJqBAAglBhjx4u8u41CXdiYxY7/S99K+J0ZCzC41uuAQd3iSpWjqbE\r\n15lvMuDfkdZWvgvt606PY/kEPkDLxhZywwjrFEAr8JyB4JkC2fcd/DVFK8Kz\r\nE2OVRSpUSIGws49RZpc5I5iwHt4AqMx/ElmneDj9eZdvTonOFFmp92U9Y20e\r\nIf3qhH0vQ/xZNAa5l2Lkwv/Sx1zgag7wXxRTeL1jhlPG0daDZU3RGKuZ7QPI\r\nQxsyyNFGsE1KS+ceco7KHzkAqjhCBQFTpqFwSzlnHKQ2Blc1sPdilKBG+bku\r\nk2Og/L9dsShkn5t2wdwGpc4/1C0yj3NZXGZdcH3sJVLza/OO7FvWwHxdORms\r\nzqXfvUHdyTKMmstKC8FIRqDHWdBXPKsRr3rEKofKTADCnZ3tr7vmd8JsnXTr\r\nL35PBRea7jjRKrl3GTyV1L4dyHEqgvoEpVxgT0B8w7BcOIkKMqYBpDMeFG/D\r\nItDacKgP7NuFZUZo7Zn8AFUbmMtLF8A1Oe4t1kksxWdg2xaAxN9UpIq+FON7\r\nOxphBbI+TCwWMM6xpoQqqBmRC66XUHItlyH1mMKXXgcuB0bsDYHPOJorLqnw\r\nUc8Z5NV0zE7fztegi86xcJrm6pUvVs0PLNoaQBKa2DRlWMMUlxKAs+ahhuQy\r\nN/4MlC7FmfoMFrYAd0TBX4g/CfN/ewNLHNE=\r\n=zzbs\r\n-----END PGP SIGNATURE-----\r\n"},"main":"./lib/cjs/index.js","types":"./lib/cjs/index.d.ts","module":"./lib/esm/index.js","gitHead":"6329a135d641db86e738612773c78e9fd5feba5c","private":false,"scripts":{"test":"npx prisma db push --force-reset && cerbos run --log-level=error --set=storage.disk.directory=../policies --set=telemetry.disabled=true -- jest src/**.test.ts","build":"tsc -p tsconfig.json && tsc -p tsconfig-cjs.json","cerbos":"cerbos server --config=./cerbos-config.yaml","prepare":"npm run build","version":"git add -A src","preversion":"npm run lint","postversion":"git push && git push --tags"},"_npmUser":{"name":"alexolivier","email":"alex@alexolivier.me"},"_npmVersion":"8.11.0","description":"An adapater library that takes a [Cerbos](https://cerbos.dev) Query Plan ([PlanResources API](https://docs.cerbos.dev/cerbos/latest/api/index.html#resources-query-plan)) response and converts it into a [Prisma](https://prisma.io) where class object. This ","directories":{},"_nodeVersion":"18.3.0","dependencies":{"@cerbos/core":"^0.5.1","@cerbos/grpc":"^0.8.0"},"_hasShrinkwrap":false,"devDependencies":{"prisma":"^4.3.1","ts-jest":"^28.0.8","ts-node":"^10.4.0","typescript":"^4.5.4","@types/jest":"^29.0.3","@types/node":"^18.7.21","@prisma/client":"^4.3.1"},"_npmOperationalInternal":{"tmp":"tmp/orm-prisma_1.0.0-alpha.0_1664202004346_0.18138505931988136","host":"s3://npm-registry-packages"}},"1.0.0":{"name":"@cerbos/orm-prisma","version":"1.0.0","author":{"name":"Cerbos"},"license":"Apache-2.0","_id":"@cerbos/orm-prisma@1.0.0","maintainers":[{"name":"ahaines","email":"andrew@haines.org.nz"},{"name":"alexolivier","email":"alex@alexolivier.me"}],"homepage":"https://cerbos.dev","dist":{"shasum":"eccc75a88e5e1c7e8f09b9e99d475a91aad7c6a7","tarball":"https://registry.npmjs.org/@cerbos/orm-prisma/-/orm-prisma-1.0.0.tgz","fileCount":6,"integrity":"sha512-jA7jz3s9tOWKpuK3zAilvbjzCsiNcx4+ui2yTVLMCxwKdjE5LcE2gPrBGqV8RTLSUyTpL9hyDC3Aa/XPILSr0w==","signatures":[{"sig":"MEYCIQDaSkXB0QV2NqZzo7wVfRJQ17ZyJ9e/P155vlJrj33J1gIhAOxa6UWWX69lpZOifz9PJOV6c3XrHgYyYOMhpRB3OEc+","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":15944,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjM3ZZACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqYPA/+IFMyQ0oMGsqRdW+0m/gqHh018+wQC64MBKxIVZhreue+Ha47\r\nWmhOwb2z534amCfWWUY6/Uqvjl7bSdvOyj98LCeti8iMVhnb0wIspWoHIxJH\r\nRs2nQiVc5pThPcemg5o3bcqyRASGj21a5FMiVwEWmEXjn0/VsX4A98o/MISK\r\nLLLy9mj8Krwdvs7rXgQaZtqGTnmrOLCMVa4lrpV3ZV0x00K3uf/kXbw4hWvP\r\nT1v6Ocp/DcOLHch1UfOWsscdBuFQOjrOq8HuCwsZ3oJCBZZX0mZNCjZsG+AL\r\nkvI/JOKffl751NoLEQJyAqfw3+g7wQ8usWBqzJ1F37tGaQvgYnYOSwzYGpvW\r\nNcS/Kd5Rfua38uRPBIO+HapHAZUVtMq1SyFCwBG16CKACCrxsP6dSesE6Rz/\r\nt8yIwPmFBVgSyHrAEJpheJLlaNWqnLvojpIv/St+sFt6DYZS0lcyyrG7Q9En\r\nTFCECxC5C3QQFp5V/t/W1GINEtYLyF9tNDnnmLElag1alQdY/SlJhySUTEHq\r\nBUw7FmbueZ5OdLt6w7ycpuFoIObPHXsLowJZofQIzX9jNcjBoAJdkRx+Sbgm\r\nnVE1FucNwws3yq1wIy7IBhy9TTtWBWYi8e4ElLSH5CivVG+LAWLlTNgw0q/l\r\nq6BBsg+syJdCkJFsW+/85gttzd/NM4noGlw=\r\n=QqLz\r\n-----END PGP SIGNATURE-----\r\n"},"main":"./lib/cjs/index.js","types":"./lib/cjs/index.d.ts","module":"./lib/esm/index.js","gitHead":"21de38586a17da0df8cd593d8867804e463d9c44","private":false,"scripts":{"test":"npx prisma db push --force-reset && cerbos run --log-level=error --set=storage.disk.directory=../policies --set=telemetry.disabled=true -- jest src/**.test.ts","build":"tsc -p tsconfig.json && tsc -p tsconfig-cjs.json","cerbos":"cerbos server --config=./cerbos-config.yaml","prepare":"npm run build","version":"git add -A src","preversion":"npm run lint","postversion":"git push && git push --tags"},"_npmUser":{"name":"alexolivier","email":"alex@alexolivier.me"},"_npmVersion":"8.11.0","description":"An adapater library that takes a [Cerbos](https://cerbos.dev) Query Plan ([PlanResources API](https://docs.cerbos.dev/cerbos/latest/api/index.html#resources-query-plan)) response and converts it into a [Prisma](https://prisma.io) where class object. This ","directories":{},"_nodeVersion":"18.3.0","dependencies":{"@cerbos/core":"^0.5.1","@cerbos/grpc":"^0.8.0"},"_hasShrinkwrap":false,"devDependencies":{"prisma":"^4.3.1","ts-jest":"^28.0.8","ts-node":"^10.4.0","typescript":"^4.5.4","@types/jest":"^29.0.3","@types/node":"^18.7.21","@prisma/client":"^4.3.1"},"_npmOperationalInternal":{"tmp":"tmp/orm-prisma_1.0.0_1664317017593_0.4458065879301598","host":"s3://npm-registry-packages"}},"1.1.0-alpha.1":{"name":"@cerbos/orm-prisma","version":"1.1.0-alpha.1","author":{"name":"Cerbos"},"license":"Apache-2.0","_id":"@cerbos/orm-prisma@1.1.0-alpha.1","maintainers":[{"name":"ahaines","email":"andrew@haines.org.nz"},{"name":"alexolivier","email":"alex@alexolivier.me"}],"homepage":"https://cerbos.dev","dist":{"shasum":"f41e7c4e291b73efab585c3fbc542cb7682f13ca","tarball":"https://registry.npmjs.org/@cerbos/orm-prisma/-/orm-prisma-1.1.0-alpha.1.tgz","fileCount":6,"integrity":"sha512-XvHVulHOXcd075fKhmUJY/9V7qDTRKwQh9o4KgC/HxpmVYG9XobpeGnUzr50t5rQqES4f1sD+Dx0Qn3VZZAcrQ==","signatures":[{"sig":"MEUCIGIvb8vueEdi5b/kxLa8OkCoWoQayZLKuZ4wynxKPOFHAiEAllf6F2+ms89Yq4+j/Kqdzmr9bp09irClwtVyVHFKBwk=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":17314},"main":"./lib/cjs/index.js","types":"./lib/cjs/index.d.ts","module":"./lib/esm/index.js","gitHead":"b2280292cd4a642fd6b8ed6ea2a4acafdd90dd56","private":false,"scripts":{"test":"npx prisma db push --force-reset && cerbos run --log-level=error --set=storage.disk.directory=../policies --set=telemetry.disabled=true -- jest src/**.test.ts","build":"tsc -p tsconfig.json && tsc -p tsconfig-cjs.json","cerbos":"cerbos server --config=./cerbos-config.yaml","prepare":"npm run build","version":"git add -A src","preversion":"npm run lint","postversion":"git push && git push --tags"},"_npmUser":{"name":"alexolivier","email":"alex@alexolivier.me"},"_npmVersion":"9.6.6","description":"An adapater library that takes a [Cerbos](https://cerbos.dev) Query Plan ([PlanResources API](https://docs.cerbos.dev/cerbos/latest/api/index.html#resources-query-plan)) response and converts it into a [Prisma](https://prisma.io) where class object. This ","directories":{},"_nodeVersion":"18.16.0","dependencies":{"@cerbos/core":"^0.5.1","@cerbos/grpc":"^0.8.0"},"_hasShrinkwrap":false,"devDependencies":{"prisma":"^4.3.1","ts-jest":"^28.0.8","ts-node":"^10.4.0","typescript":"^4.5.4","@types/jest":"^29.0.3","@types/node":"^18.7.21","@prisma/client":"^4.3.1"},"_npmOperationalInternal":{"tmp":"tmp/orm-prisma_1.1.0-alpha.1_1687984494578_0.2510566709451769","host":"s3://npm-registry-packages"}},"1.1.0":{"name":"@cerbos/orm-prisma","version":"1.1.0","author":{"name":"Cerbos"},"license":"Apache-2.0","_id":"@cerbos/orm-prisma@1.1.0","maintainers":[{"name":"ahaines","email":"andrew@haines.org.nz"},{"name":"alexolivier","email":"alex@alexolivier.me"}],"homepage":"https://cerbos.dev","dist":{"shasum":"f30baabc1debea9e9bf0e2320a5450ef8fb99ba7","tarball":"https://registry.npmjs.org/@cerbos/orm-prisma/-/orm-prisma-1.1.0.tgz","fileCount":6,"integrity":"sha512-xw++z96cz11Re6EbMJ8CcACDVi8RF+lk3vDV5NsgD78jHJDlSfVGd6SsP56x/N0CCKHdyTEjPIwhZhwLe/3hGQ==","signatures":[{"sig":"MEQCIH1NluW+FmbqQPQEBNDHkHevF7naQEZqJMUvYjH+j0D1AiB3hVr6+///UkZ3DVV6kcB1LAC9vwheYonPL6EbdFKjlQ==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":17306},"main":"./lib/cjs/index.js","types":"./lib/cjs/index.d.ts","module":"./lib/esm/index.js","gitHead":"08babae51df42182ef96133d01e59db26807c809","private":false,"scripts":{"test":"npx prisma db push --force-reset && cerbos run --log-level=error --set=storage.disk.directory=../policies --set=telemetry.disabled=true -- jest src/**.test.ts","build":"tsc -p tsconfig.json && tsc -p tsconfig-cjs.json","cerbos":"cerbos server --config=./cerbos-config.yaml","prepare":"npm run build","version":"git add -A src","preversion":"npm run lint","postversion":"git push && git push --tags"},"_npmUser":{"name":"alexolivier","email":"alex@alexolivier.me"},"_npmVersion":"9.6.6","description":"An adapater library that takes a [Cerbos](https://cerbos.dev) Query Plan ([PlanResources API](https://docs.cerbos.dev/cerbos/latest/api/index.html#resources-query-plan)) response and converts it into a [Prisma](https://prisma.io) where class object. This ","directories":{},"_nodeVersion":"18.16.0","dependencies":{"@cerbos/core":"^0.5.1","@cerbos/grpc":"^0.8.0"},"_hasShrinkwrap":false,"devDependencies":{"prisma":"^4.3.1","ts-jest":"^28.0.8","ts-node":"^10.4.0","typescript":"^4.5.4","@types/jest":"^29.0.3","@types/node":"^18.7.21","@prisma/client":"^4.3.1"},"_npmOperationalInternal":{"tmp":"tmp/orm-prisma_1.1.0_1689259606150_0.6925554181598887","host":"s3://npm-registry-packages"}},"1.1.1":{"name":"@cerbos/orm-prisma","version":"1.1.1","author":{"name":"Cerbos"},"license":"Apache-2.0","_id":"@cerbos/orm-prisma@1.1.1","maintainers":[{"name":"ahaines","email":"andrew@haines.org.nz"},{"name":"alexolivier","email":"alex@alexolivier.me"}],"homepage":"https://cerbos.dev","dist":{"shasum":"3db3a41cced3d5f45c1e89bf7dbab074fb77d328","tarball":"https://registry.npmjs.org/@cerbos/orm-prisma/-/orm-prisma-1.1.1.tgz","fileCount":6,"integrity":"sha512-Tbmhpc734ZJsEcMgPcnX4Gs/7sMQvv1q/8dYFl9xhPufq+asMjTXOy6NUA/SoGsLnQtx5SLtw+sjPn1IDHsEow==","signatures":[{"sig":"MEUCIQCEs0i/GHFpCpePt1ajysR8yJztLzQaGwm2baxwWHffsQIgYvtFXzZQb3uL0jwbSaUA81IVC6iP/tgvvQGezCjlyN4=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":17314},"main":"./lib/cjs/index.js","types":"./lib/cjs/index.d.ts","module":"./lib/esm/index.js","gitHead":"1e7073ed5b2cb952ccbcad6410b2962b0826aca3","private":false,"scripts":{"test":"npx prisma db push --force-reset && cerbos run --log-level=error --set=storage.disk.directory=../policies --set=telemetry.disabled=true -- jest src/**.test.ts","build":"tsc -p tsconfig.json && tsc -p tsconfig-cjs.json","cerbos":"cerbos server --config=./cerbos-config.yaml","prepare":"npm run build","version":"git add -A src","preversion":"npm run lint","postversion":"git push && git push --tags"},"_npmUser":{"name":"alexolivier","email":"alex@alexolivier.me"},"_npmVersion":"9.6.6","description":"An adapter library that takes a [Cerbos](https://cerbos.dev) Query Plan ([PlanResources API](https://docs.cerbos.dev/cerbos/latest/api/index.html#resources-query-plan)) response and converts it into a [Prisma](https://prisma.io) where class object. This i","directories":{},"_nodeVersion":"18.16.0","dependencies":{"@cerbos/core":"^0.12.0","@cerbos/grpc":"^0.12.0"},"_hasShrinkwrap":false,"devDependencies":{"prisma":"^4.3.1","ts-jest":"^29.0.0","ts-node":"^10.4.0","typescript":"^5.0.0","@types/jest":"^29.0.3","@types/node":"^18.7.21","@prisma/client":"^4.3.1"},"_npmOperationalInternal":{"tmp":"tmp/orm-prisma_1.1.1_1689759303372_0.651566352456477","host":"s3://npm-registry-packages"}},"2.0.0-alpha.1":{"name":"@cerbos/orm-prisma","version":"2.0.0-alpha.1","author":{"name":"Cerbos"},"license":"Apache-2.0","_id":"@cerbos/orm-prisma@2.0.0-alpha.1","maintainers":[{"name":"alexolivier","email":"alex@alexolivier.me"},{"name":"ahaines","email":"andrew@haines.org.nz"}],"homepage":"https://cerbos.dev","dist":{"shasum":"598583d47dcc047c0059d093061e31a127e35f42","tarball":"https://registry.npmjs.org/@cerbos/orm-prisma/-/orm-prisma-2.0.0-alpha.1.tgz","fileCount":6,"integrity":"sha512-5JsIMOSA1aLWbh9fnS40kEbmt5Gm8tjqPHxm37SfDcRgs7pLqzKN/Ddp5Lo7kh7PNSx1uPi3vCkVI0C3a30poQ==","signatures":[{"sig":"MEUCIH+2+vQHYmvdgVHAuSCwLTTXd6lqSkPiDV9YlysWQHzvAiEA3yRJdKzb0gLtUxNwx5/NvyEEyIc688w0gZf0UASvgT8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":40539},"main":"./lib/cjs/index.js","types":"./lib/cjs/index.d.ts","module":"./lib/esm/index.js","gitHead":"0b26c34eec75e4ea5255a68f15595e47063e5ae9","private":false,"scripts":{"test":"npx prisma db push --force-reset && cerbos run --log-level=error --set=storage.disk.directory=../policies --set=telemetry.disabled=true -- jest src/**.test.ts","build":"tsc -p tsconfig.json && tsc -p tsconfig-cjs.json","cerbos":"cerbos server --config=./cerbos-config.yaml","prepare":"npm run build","version":"git add -A src","preversion":"npm run lint","postversion":"git push && git push --tags"},"_npmUser":{"name":"alexolivier","email":"alex@alexolivier.me"},"_npmVersion":"10.9.0","description":"An adapter library that takes a [Cerbos](https://cerbos.dev) Query Plan ([PlanResources API](https://docs.cerbos.dev/cerbos/latest/api/index.html#resources-query-plan)) response and converts it into a [Prisma](https://prisma.io) where class object. This i","directories":{},"_nodeVersion":"22.12.0","dependencies":{"@cerbos/core":"^0.21.0","@cerbos/grpc":"^0.20.0"},"_hasShrinkwrap":false,"devDependencies":{"prisma":"^6.0.0","ts-jest":"^29.0.0","ts-node":"^10.4.0","typescript":"^5.0.0","@types/jest":"^29.0.3","@types/node":"^22.0.0","@prisma/client":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/orm-prisma_2.0.0-alpha.1_1740141848274_0.01011168136258167","host":"s3://npm-registry-packages-npm-production"}},"2.0.0-alpha.2":{"name":"@cerbos/orm-prisma","version":"2.0.0-alpha.2","author":{"name":"Cerbos"},"license":"Apache-2.0","_id":"@cerbos/orm-prisma@2.0.0-alpha.2","maintainers":[{"name":"alexolivier","email":"alex@alexolivier.me"},{"name":"ahaines","email":"andrew@haines.org.nz"}],"homepage":"https://cerbos.dev","dist":{"shasum":"599eadeef44c8dd01ec7379b12ad9e7184ef0ebd","tarball":"https://registry.npmjs.org/@cerbos/orm-prisma/-/orm-prisma-2.0.0-alpha.2.tgz","fileCount":6,"integrity":"sha512-h0Y612G3jyZJQ1CD5PO1JRbxe3ziGraaUXmJkAaGti0E/XQP2Lxlm5g2rhYNvISa11JuuScJUpgGzwWBZvCulQ==","signatures":[{"sig":"MEYCIQChfMvKyxopeNB+bYOVu/a+tsRXeudALG8sqcxvF4e9qgIhAIfs885dUyomIe2cw580UeuCszuVCn6wh2Hf/islM2X2","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":57243},"main":"./lib/cjs/index.js","types":"./lib/cjs/index.d.ts","module":"./lib/esm/index.js","gitHead":"7ef2f02a248a1f1801789c500121eceeb87629ce","private":false,"scripts":{"test":"npx prisma db push --force-reset && cerbos run --log-level=error --set=storage.disk.directory=../policies --set=telemetry.disabled=true -- jest src/**.test.ts","build":"tsc -p tsconfig.json && tsc -p tsconfig-cjs.json","cerbos":"cerbos server --config=./cerbos-config.yaml","prepare":"npm run build","version":"git add -A src","preversion":"npm run lint","postversion":"git push && git push --tags"},"_npmUser":{"name":"alexolivier","email":"alex@alexolivier.me"},"_npmVersion":"10.9.0","description":"An adapter library that takes a [Cerbos](https://cerbos.dev) Query Plan ([PlanResources API](https://docs.cerbos.dev/cerbos/latest/api/index.html#resources-query-plan)) response and converts it into a [Prisma](https://prisma.io) where class object. This i","directories":{},"_nodeVersion":"22.12.0","dependencies":{"@cerbos/core":"^0.21.0","@cerbos/grpc":"^0.20.0"},"_hasShrinkwrap":false,"devDependencies":{"prisma":"^6.4.1","ts-jest":"^29.0.0","ts-node":"^10.4.0","typescript":"^5.0.0","@types/jest":"^29.0.3","@types/node":"^22.0.0","@prisma/client":"^6.4.1"},"_npmOperationalInternal":{"tmp":"tmp/orm-prisma_2.0.0-alpha.2_1740250378032_0.8793073074830233","host":"s3://npm-registry-packages-npm-production"}},"2.0.0":{"name":"@cerbos/orm-prisma","version":"2.0.0","author":{"name":"Cerbos"},"license":"Apache-2.0","_id":"@cerbos/orm-prisma@2.0.0","maintainers":[{"name":"alexolivier","email":"alex@alexolivier.me"},{"name":"ahaines","email":"andrew@haines.org.nz"}],"homepage":"https://cerbos.dev","dist":{"shasum":"e714d468a69dccd50b121ca8b6aec4dae68c52ca","tarball":"https://registry.npmjs.org/@cerbos/orm-prisma/-/orm-prisma-2.0.0.tgz","fileCount":6,"integrity":"sha512-MpCBgflXQmgQ1ivfvM+hyO6kdH0QO/wNSnn3AIFoOtclE7qwwpQh8hEpvex9yxlit8vTGR234Kag0UJ1V9XksQ==","signatures":[{"sig":"MEUCIA9TvDp+Xj7+6RtSVE7SmYzYUk/8zfBfqrYv5ifTonxlAiEAqzQP51J9K0Z3G+4h/TS1VN8V5fCHQwFeXLaGsdkTIeQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":60514},"main":"./lib/cjs/index.js","types":"./lib/cjs/index.d.ts","module":"./lib/esm/index.js","gitHead":"ce455799d5dd677bb50a5fc3ff2392ab7749c9eb","private":false,"scripts":{"test":"npx prisma db push --force-reset && cerbos run --log-level=error --set=storage.disk.directory=../policies --set=telemetry.disabled=true -- jest src/**.test.ts","build":"tsc -p tsconfig.json && tsc -p tsconfig-cjs.json","cerbos":"cerbos server --config=./cerbos-config.yaml","prepare":"npm run build","version":"git add -A src","postversion":"git push && git push --tags"},"_npmUser":{"name":"alexolivier","email":"alex@alexolivier.me"},"_npmVersion":"10.9.0","description":"An adapter library that takes a [Cerbos](https://cerbos.dev) Query Plan ([PlanResources API](https://docs.cerbos.dev/cerbos/latest/api/index.html#resources-query-plan)) response and converts it into a [Prisma](https://prisma.io) where clause object. This ","directories":{},"_nodeVersion":"22.12.0","dependencies":{"@cerbos/core":"^0.21.0","@cerbos/grpc":"^0.20.0"},"_hasShrinkwrap":false,"devDependencies":{"prisma":"^6.4.1","ts-jest":"^29.0.0","ts-node":"^10.4.0","typescript":"^5.0.0","@types/jest":"^29.0.3","@types/node":"^22.0.0","expect-type":"^1.1.0","@prisma/client":"^6.4.1"},"_npmOperationalInternal":{"tmp":"tmp/orm-prisma_2.0.0_1740474519849_0.5212017193421989","host":"s3://npm-registry-packages-npm-production"}},"2.0.1":{"name":"@cerbos/orm-prisma","version":"2.0.1","keywords":["cerbos","prisma","orm","authorization","permissions"],"author":{"name":"Cerbos"},"license":"Apache-2.0","_id":"@cerbos/orm-prisma@2.0.1","maintainers":[{"name":"alexolivier","email":"alex@alexolivier.me"},{"name":"ahaines","email":"andrew@haines.org.nz"}],"homepage":"https://cerbos.dev","dist":{"shasum":"177abd3236b45104d6d2680f4af442a185b51cfb","tarball":"https://registry.npmjs.org/@cerbos/orm-prisma/-/orm-prisma-2.0.1.tgz","fileCount":8,"integrity":"sha512-GSG2ATnVpOz/6OYULOe7S+GcgCGzqYgRxanXHp5Hm2hrY40z5r4XWYY6VQNAee0XtzTiKSpkVb2+txte4aQ9vg==","signatures":[{"sig":"MEUCIQDvUfgUa205RZzVXZ2GQrduboTuV+L/s6r4ckjlOlMWhAIgE5u0bsoBM0+Gm4ik3xkZEFc0icdCOVQvM9zDaU9wVJs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":94592},"main":"./lib/cjs/index.js","types":"./lib/types/index.d.ts","module":"./lib/esm/index.js","engines":{"node":">=14.0.0"},"exports":{".":{"types":"./lib/types/index.d.ts","import":"./lib/esm/index.js","require":"./lib/cjs/index.js"}},"gitHead":"9713b50b4b3934021c8ff8624842f6c38fd01f6f","private":false,"scripts":{"test":"npx prisma db push --force-reset && cerbos run --log-level=error --set=storage.disk.directory=../policies --set=telemetry.disabled=true -- jest src/**.test.ts","build":"npm run clean && npm run build:types && npm run build:cjs && npm run build:esm","clean":"rimraf lib","cerbos":"cerbos server --config=./cerbos-config.yaml","prepare":"npm run build","version":"git add -A src","build:cjs":"tsc -p tsconfig.cjs.json","build:esm":"tsc -p tsconfig.esm.json","build:types":"tsc -p tsconfig.types.json","prepublishOnly":"npm test"},"_npmUser":{"name":"alexolivier","email":"alex@alexolivier.me"},"_npmVersion":"10.9.0","description":"Prisma adapter for Cerbos query plans","directories":{},"sideEffects":false,"_nodeVersion":"22.12.0","dependencies":{"@cerbos/core":"^0.21.0","@cerbos/grpc":"^0.20.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"prisma":"^6.4.1","rimraf":"^5.0.0","ts-jest":"^29.0.0","ts-node":"^10.4.0","typescript":"^5.0.0","@types/jest":"^29.0.3","@types/node":"^22.0.0","expect-type":"^1.1.0","@prisma/client":"^6.4.1"},"peerDependencies":{"@prisma/client":"^5.0.0 || ^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/orm-prisma_2.0.1_1740477786807_0.8222077748820147","host":"s3://npm-registry-packages-npm-production"}},"3.0.1":{"name":"@cerbos/orm-prisma","version":"3.0.1","keywords":["cerbos","prisma","orm","authorization","permissions"],"author":{"url":"https://cerbos.dev","name":"Cerbos","email":"help@cerbos.dev"},"license":"Apache-2.0","_id":"@cerbos/orm-prisma@3.0.1","maintainers":[{"name":"alexolivier","email":"alex@alexolivier.me"},{"name":"ahaines","email":"andrew@haines.org.nz"}],"homepage":"https://cerbos.dev","bugs":{"url":"https://github.com/cerbos/query-plan-adapters/issues"},"dist":{"shasum":"674501e8457889a83554364ac598c778b263791c","tarball":"https://registry.npmjs.org/@cerbos/orm-prisma/-/orm-prisma-3.0.1.tgz","fileCount":12,"integrity":"sha512-XY6asy7Jdd3ju4wnvGkXeibSuFsx+3mWNT6ae5Y6Ad2szTo2raw5ADD+hMqMweJpN8Z1EN2ZmJ1NWTYWvzX6Yg==","signatures":[{"sig":"MEUCIEGFnOziGAZxs3JnqW6Pvfdo6sr5ZOQbkww9NW0MiJucAiEA86+Ez6yn1gvLlFnF1c43JK9un4sNxvvr/MmPx35yMjQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@cerbos%2form-prisma@3.0.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":497321},"main":"./lib/index.js","types":"./lib/index.d.ts","engines":{"node":">=20.0.0"},"exports":{".":{"types":"./lib/index.d.ts","default":"./lib/index.js"}},"gitHead":"b3d2a75be887b47059680eb59ce3d4ce6f0f126f","scripts":{"test":"npx prisma db push --force-reset && cerbos run --log-level=error --set=storage.disk.directory=../policies --set=telemetry.disabled=true -- jest src/**.test.ts","build":"tsc --build","clean":"rimraf lib","cerbos":"cerbos server --config=./cerbos-config.yaml","prepare":"npm run build","version":"git add -A src","prepublishOnly":"npm test"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:c000c4fc-e88e-4f67-8064-51f32295ad9a"}},"repository":{"url":"git+https://github.com/cerbos/query-plan-adapters.git","type":"git","directory":"packages/prisma"},"_npmVersion":"11.6.2","description":"Prisma adapter for Cerbos query plans","directories":{},"_nodeVersion":"24.11.1","dependencies":{"tslib":"^2.8.1","@cerbos/core":"^0.25.0","@cerbos/grpc":"^0.23.0","@tsconfig/node20":"^20.1.7","@tsconfig/strictest":"^2.0.8"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"prisma":"^6.4.1","rimraf":"^6.0.0","ts-jest":"^29.0.0","ts-node":"^10.4.0","typescript":"^5.0.0","@types/jest":"^30.0.0","@types/node":"^24.0.0","expect-type":"^1.1.0","@prisma/client":"^6.4.1"},"peerDependencies":{"@prisma/client":"^5.0.0 || ^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/orm-prisma_3.0.1_1763401330346_0.19095617405428622","host":"s3://npm-registry-packages-npm-production"}},"3.1.0":{"name":"@cerbos/orm-prisma","version":"3.1.0","keywords":["cerbos","prisma","orm","authorization","permissions"],"author":{"url":"https://cerbos.dev","name":"Cerbos","email":"help@cerbos.dev"},"license":"Apache-2.0","_id":"@cerbos/orm-prisma@3.1.0","maintainers":[{"name":"alexolivier","email":"alex@alexolivier.me"},{"name":"ahaines","email":"andrew@haines.org.nz"}],"homepage":"https://cerbos.dev","bugs":{"url":"https://github.com/cerbos/query-plan-adapters/issues"},"dist":{"shasum":"bdfcd1ce0feba32ad2f24d966113d763e6d7d84d","tarball":"https://registry.npmjs.org/@cerbos/orm-prisma/-/orm-prisma-3.1.0.tgz","fileCount":33,"integrity":"sha512-GWHRJO57HcUYLpM8ZmDQC6+Vv2Gj4brlk6CoxhJdhXh6xsed8f2eS5cM58d0GF20w18iQVciLU94QJ8YPPPp2w==","signatures":[{"sig":"MEUCIFyVXOCfHnC/5ISvciUNWSO6wSTBhOGwUJbH1B1A87INAiEAkwEVMDVCfuWhs8fzq2Pos2S4Vi1Cx6P+hUaBg256Yx0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@cerbos%2form-prisma@3.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1396705},"main":"./lib/index.js","types":"./lib/index.d.ts","engines":{"node":">=20.0.0"},"exports":{".":{"types":"./lib/index.d.ts","default":"./lib/index.js"}},"gitHead":"6a3587a43c747266c2a797bc1937b8afdf056a2e","scripts":{"test":"npm run test:v7","build":"tsc --build","clean":"rimraf lib","cerbos":"cerbos server --config=./cerbos-config.yaml","prepare":"npm run build","test:v6":"node node_modules/prisma-v6/build/index.js db push --force-reset --schema=prisma/schema.v6.prisma && PRISMA_VERSION=6 cerbos run --log-level=error --set=storage.disk.directory=../policies --set=telemetry.disabled=true -- jest src/**.test.ts","test:v7":"node node_modules/prisma/build/index.js db push --force-reset && PRISMA_VERSION=7 cerbos run --log-level=error --set=storage.disk.directory=../policies --set=telemetry.disabled=true -- jest src/**.test.ts","version":"git add -A src","prepublishOnly":"npm test","prisma:generate":"bash scripts/generate-clients.sh"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:c000c4fc-e88e-4f67-8064-51f32295ad9a"}},"repository":{"url":"git+https://github.com/cerbos/query-plan-adapters.git","type":"git","directory":"packages/prisma"},"_npmVersion":"11.7.0","description":"Prisma adapter for Cerbos query plans","directories":{},"_nodeVersion":"24.12.0","dependencies":{"@cerbos/core":"^0.26.0","@cerbos/grpc":"^0.23.0"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"prisma":"^7.2.0","rimraf":"^6.0.0","ts-jest":"^29.4.6","ts-node":"^10.4.0","prisma-v6":"npm:prisma@^6.0.0","typescript":"^5.0.0","@types/jest":"^30.0.0","@types/node":"^24.0.0","expect-type":"^1.1.0","@jest/globals":"^30.2.0","@prisma/client":"^7.2.0","@tsconfig/node24":"^24.0.3","@prisma/client-v6":"npm:@prisma/client@^6.0.0","@tsconfig/strictest":"^2.0.8","@prisma/adapter-better-sqlite3":"^7.2.0"},"peerDependencies":{"@prisma/client":"^5.0.0 || ^6.0.0 || ^7.0.0"},"_npmOperationalInternal":{"tmp":"tmp/orm-prisma_3.1.0_1768558479984_0.6637581559578782","host":"s3://npm-registry-packages-npm-production"}},"3.1.1":{"name":"@cerbos/orm-prisma","version":"3.1.1","keywords":["cerbos","prisma","orm","authorization","permissions"],"author":{"url":"https://cerbos.dev","name":"Cerbos","email":"help@cerbos.dev"},"license":"Apache-2.0","_id":"@cerbos/orm-prisma@3.1.1","maintainers":[{"name":"alexolivier","email":"alex@alexolivier.me"},{"name":"ahaines","email":"andrew@haines.org.nz"}],"homepage":"https://cerbos.dev","bugs":{"url":"https://github.com/cerbos/query-plan-adapters/issues"},"dist":{"shasum":"db7c41b0a223ffdb5033107bc201f06514514e38","tarball":"https://registry.npmjs.org/@cerbos/orm-prisma/-/orm-prisma-3.1.1.tgz","fileCount":33,"integrity":"sha512-nR1wdtVa14W+kGIjKV9Jhpfe+eWd9QjvqNiSr6GCbEzqneTdSzvb5lUlnhgsP3SRhe8FRklG79hArtzo1PDObg==","signatures":[{"sig":"MEQCIE/YzfH6BwcOwQYwvHNEdDDqLaAev4n/+yRU/Ecp5BFsAiBd4MFh5bU+Az5eWNyIDXErLGaOaqqPo+oG+OHQTC8UuQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@cerbos%2form-prisma@3.1.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1423430},"main":"./lib/index.js","types":"./lib/index.d.ts","engines":{"node":">=20.0.0"},"exports":{".":{"types":"./lib/index.d.ts","default":"./lib/index.js"}},"gitHead":"d9df1f0cb2bbe77ab3173ecc38731462a2593941","scripts":{"test":"npm run test:v7","build":"tsc --build","clean":"rimraf lib","cerbos":"cerbos server --config=./cerbos-config.yaml","prepare":"npm run build","test:v6":"node node_modules/prisma-v6/build/index.js db push --force-reset --schema=prisma/schema.v6.prisma && PRISMA_VERSION=6 cerbos run --log-level=error --set=storage.disk.directory=../policies --set=telemetry.disabled=true -- jest src/**.test.ts","test:v7":"node node_modules/prisma/build/index.js db push --force-reset && PRISMA_VERSION=7 cerbos run --log-level=error --set=storage.disk.directory=../policies --set=telemetry.disabled=true -- jest src/**.test.ts","version":"git add -A src","prisma:generate":"bash scripts/generate-clients.sh"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:c000c4fc-e88e-4f67-8064-51f32295ad9a"}},"repository":{"url":"git+https://github.com/cerbos/query-plan-adapters.git","type":"git","directory":"packages/prisma"},"_npmVersion":"11.8.0","description":"Prisma adapter for Cerbos query plans","directories":{},"_nodeVersion":"24.13.0","dependencies":{"@cerbos/core":"^0.27.0","@cerbos/grpc":"^0.24.0"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"prisma":"^7.2.0","rimraf":"^6.0.0","ts-jest":"^29.4.6","ts-node":"^10.4.0","prisma-v6":"npm:prisma@^6.0.0","typescript":"^5.0.0","@types/jest":"^30.0.0","@types/node":"^24.0.0","expect-type":"^1.1.0","@jest/globals":"^30.2.0","@prisma/client":"^7.2.0","@tsconfig/node24":"^24.0.3","@prisma/client-v6":"npm:@prisma/client@^6.0.0","@tsconfig/strictest":"^2.0.8","@prisma/adapter-better-sqlite3":"^7.2.0"},"peerDependencies":{"@prisma/client":"^5.0.0 || ^6.0.0 || ^7.0.0"},"_npmOperationalInternal":{"tmp":"tmp/orm-prisma_3.1.1_1770036750312_0.6396270516782774","host":"s3://npm-registry-packages-npm-production"}},"3.2.0":{"name":"@cerbos/orm-prisma","version":"3.2.0","keywords":["cerbos","prisma","orm","authorization","permissions"],"author":{"url":"https://cerbos.dev","name":"Cerbos","email":"help@cerbos.dev"},"license":"Apache-2.0","_id":"@cerbos/orm-prisma@3.2.0","maintainers":[{"name":"alexolivier","email":"alex@alexolivier.me"},{"name":"ahaines","email":"andrew@haines.org.nz"}],"homepage":"https://cerbos.dev","bugs":{"url":"https://github.com/cerbos/query-plan-adapters/issues"},"dist":{"shasum":"f704d02adf792bae36dc3d53f5f28aef4ec5dc3a","tarball":"https://registry.npmjs.org/@cerbos/orm-prisma/-/orm-prisma-3.2.0.tgz","fileCount":33,"integrity":"sha512-sB8XjR70HsbDfwZ0sQsTknUGdbmmsVm/Jk8tXk9Z5SlwTdzmmIVz6E1luoEH9aAIqOKdMFTu8SPTGmfSvlitRw==","signatures":[{"sig":"MEUCIQCI36UXlslPOTJcK05Lc0uBk4fGXjyPqzOCCyXgzvkPUwIgGjAE2ChgIwblLjtSPS7SK1BVZfUHpMln/qvMjpmfRYE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@cerbos%2form-prisma@3.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1423430},"main":"./lib/index.js","types":"./lib/index.d.ts","engines":{"node":">=20.0.0"},"exports":{".":{"types":"./lib/index.d.ts","default":"./lib/index.js"}},"gitHead":"5490cc5c17219802a40706a85ea64e07ba83d5ee","scripts":{"test":"npm run test:v7","build":"tsc --build","clean":"rimraf lib","cerbos":"cerbos server --config=./cerbos-config.yaml","prepare":"npm run build","test:v6":"node node_modules/prisma-v6/build/index.js db push --force-reset --schema=prisma/schema.v6.prisma && PRISMA_VERSION=6 cerbos run --log-level=error --set=storage.disk.directory=../policies --set=telemetry.disabled=true -- jest src/**.test.ts","test:v7":"node node_modules/prisma/build/index.js db push --force-reset && PRISMA_VERSION=7 cerbos run --log-level=error --set=storage.disk.directory=../policies --set=telemetry.disabled=true -- jest src/**.test.ts","version":"git add -A src","prisma:generate":"bash scripts/generate-clients.sh"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:c000c4fc-e88e-4f67-8064-51f32295ad9a"}},"repository":{"url":"git+https://github.com/cerbos/query-plan-adapters.git","type":"git","directory":"packages/prisma"},"_npmVersion":"11.8.0","description":"Prisma adapter for Cerbos query plans","directories":{},"_nodeVersion":"24.13.0","dependencies":{"@cerbos/core":"^0.27.0","@cerbos/grpc":"^0.24.0"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"prisma":"^7.2.0","rimraf":"^6.0.0","ts-jest":"^29.4.6","ts-node":"^10.4.0","prisma-v6":"npm:prisma@^6.0.0","typescript":"^5.0.0","@types/jest":"^30.0.0","@types/node":"^24.0.0","expect-type":"^1.1.0","@jest/globals":"^30.2.0","@prisma/client":"^7.2.0","@tsconfig/node24":"^24.0.3","@prisma/client-v6":"npm:@prisma/client@^6.0.0","@tsconfig/strictest":"^2.0.8","@prisma/adapter-better-sqlite3":"^7.2.0"},"peerDependencies":{"@prisma/client":"^5.0.0 || ^6.0.0 || ^7.0.0"},"_npmOperationalInternal":{"tmp":"tmp/orm-prisma_3.2.0_1770036774891_0.9841617491715637","host":"s3://npm-registry-packages-npm-production"}},"3.2.1":{"name":"@cerbos/orm-prisma","version":"3.2.1","keywords":["cerbos","prisma","orm","authorization","permissions"],"author":{"url":"https://cerbos.dev","name":"Cerbos","email":"help@cerbos.dev"},"license":"Apache-2.0","_id":"@cerbos/orm-prisma@3.2.1","maintainers":[{"name":"alexolivier","email":"alex@alexolivier.me"},{"name":"ahaines","email":"andrew@haines.org.nz"}],"homepage":"https://cerbos.dev","bugs":{"url":"https://github.com/cerbos/query-plan-adapters/issues"},"dist":{"shasum":"83b45428bbc6dd3d7f6d1d5da1e565564ab778b9","tarball":"https://registry.npmjs.org/@cerbos/orm-prisma/-/orm-prisma-3.2.1.tgz","fileCount":33,"integrity":"sha512-T4HSS5g1Lwb25o6y1u9kFOuigCP8JODhNZU2MrQ/lZSJeTl6yYAmFX0dLEbF9TBJc+Q6mn4E0bm4M3x7PmO14Q==","signatures":[{"sig":"MEQCIHkjrzCarEEkqVgKyZ4kX/8TZjwuTPQKvcT5r2BIr2u6AiACsoWKyvyks0Af1Z/NtJLpZhMTu9xJpztfDpDATs3PWw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@cerbos%2form-prisma@3.2.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1422607},"main":"./lib/index.js","types":"./lib/index.d.ts","engines":{"node":">=20.0.0"},"exports":{".":{"types":"./lib/index.d.ts","default":"./lib/index.js"}},"gitHead":"d439492e7b1e2520beb8348d561701c8e24b7c8c","scripts":{"test":"npm run test:v7","build":"tsc --build","clean":"rimraf lib","cerbos":"cerbos server --config=./cerbos-config.yaml","prepare":"npm run build","test:v6":"node node_modules/prisma-v6/build/index.js db push --force-reset --schema=prisma/schema.v6.prisma && PRISMA_VERSION=6 cerbos run --log-level=error --set=storage.disk.directory=../policies --set=telemetry.disabled=true -- jest src/**.test.ts","test:v7":"node node_modules/prisma/build/index.js db push --force-reset && PRISMA_VERSION=7 cerbos run --log-level=error --set=storage.disk.directory=../policies --set=telemetry.disabled=true -- jest src/**.test.ts","version":"git add -A src","prisma:generate":"bash scripts/generate-clients.sh"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:c000c4fc-e88e-4f67-8064-51f32295ad9a"}},"repository":{"url":"git+https://github.com/cerbos/query-plan-adapters.git","type":"git","directory":"packages/prisma"},"_npmVersion":"11.8.0","description":"Prisma adapter for Cerbos query plans","directories":{},"_nodeVersion":"24.13.0","dependencies":{"@cerbos/core":"^0.27.0","@cerbos/grpc":"^0.24.0"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"prisma":"^7.2.0","rimraf":"^6.0.0","ts-jest":"^29.4.6","ts-node":"^10.4.0","prisma-v6":"npm:prisma@^6.0.0","typescript":"^5.0.0","@types/jest":"^30.0.0","@types/node":"^24.0.0","expect-type":"^1.1.0","@jest/globals":"^30.2.0","@prisma/client":"^7.2.0","@tsconfig/node24":"^24.0.3","@prisma/client-v6":"npm:@prisma/client@^6.0.0","@tsconfig/strictest":"^2.0.8","@prisma/adapter-better-sqlite3":"^7.2.0"},"peerDependencies":{"@prisma/client":"^5.0.0 || ^6.0.0 || ^7.0.0"},"_npmOperationalInternal":{"tmp":"tmp/orm-prisma_3.2.1_1770052934845_0.7958060452153286","host":"s3://npm-registry-packages-npm-production"}},"3.3.0":{"name":"@cerbos/orm-prisma","version":"3.3.0","keywords":["cerbos","prisma","orm","authorization","permissions"],"author":{"url":"https://cerbos.dev","name":"Cerbos","email":"help@cerbos.dev"},"license":"Apache-2.0","_id":"@cerbos/orm-prisma@3.3.0","maintainers":[{"name":"alexolivier","email":"alex@alexolivier.me"},{"name":"ahaines","email":"andrew@haines.org.nz"}],"homepage":"https://cerbos.dev","bugs":{"url":"https://github.com/cerbos/query-plan-adapters/issues"},"dist":{"shasum":"e9af516cf2bc65666742b6e4bb07ae54336db803","tarball":"https://registry.npmjs.org/@cerbos/orm-prisma/-/orm-prisma-3.3.0.tgz","fileCount":33,"integrity":"sha512-uW6wWkgx7Td+MhinDZDyMIU7WFUGx2qNTdVgSywCUz6/3F0Jv9X17PHQZBxPgRDNJ6IOrVJvtV/uAINaa+K+hA==","signatures":[{"sig":"MEUCIGFYwE5JgzfKU1tCoiVl2EV+fJTzjsC6yEXCIuXLgHsqAiEAzKyvUKT2mgsO0b1JCWDfrtB6RPMrwZVooe1IOOPk81Q=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@cerbos%2form-prisma@3.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1511147},"main":"./lib/index.js","types":"./lib/index.d.ts","engines":{"node":">=20.0.0"},"exports":{".":{"types":"./lib/index.d.ts","default":"./lib/index.js"}},"gitHead":"80b999584d8c41cfa2d898910f40128c6a405408","scripts":{"test":"npm run test:v7","build":"tsc --build","clean":"rimraf lib","cerbos":"cerbos server --config=./cerbos-config.yaml","prepare":"npm run build","test:v6":"node node_modules/prisma-v6/build/index.js db push --force-reset --schema=prisma/schema.v6.prisma && PRISMA_VERSION=6 cerbos run --log-level=error --set=storage.disk.directory=../policies --set=telemetry.disabled=true -- jest src/**.test.ts","test:v7":"node node_modules/prisma/build/index.js db push --force-reset && PRISMA_VERSION=7 cerbos run --log-level=error --set=storage.disk.directory=../policies --set=telemetry.disabled=true -- jest src/**.test.ts","version":"git add -A src","prisma:generate":"bash scripts/generate-clients.sh"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:c000c4fc-e88e-4f67-8064-51f32295ad9a"}},"overrides":{"hono":"^4.12.8","effect":"^3.20.0","lodash":"^4.17.23","minimatch":"^10.0.0","@hono/node-server":"^1.19.10"},"repository":{"url":"git+https://github.com/cerbos/query-plan-adapters.git","type":"git","directory":"packages/prisma"},"_npmVersion":"11.12.0","description":"Prisma adapter for Cerbos query plans","directories":{},"_nodeVersion":"24.14.0","dependencies":{"@cerbos/core":"^0.28.0","@cerbos/grpc":"^0.25.0"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"prisma":"^7.5.0","rimraf":"^6.0.0","ts-jest":"^29.4.6","ts-node":"^10.4.0","prisma-v6":"npm:prisma@^6.0.0","typescript":"^5.0.0","@types/jest":"^30.0.0","@types/node":"^24.0.0","expect-type":"^1.1.0","@jest/globals":"^30.2.0","@prisma/client":"^7.5.0","@tsconfig/node24":"^24.0.3","@prisma/client-v6":"npm:@prisma/client@^6.0.0","@tsconfig/strictest":"^2.0.8","@prisma/adapter-better-sqlite3":"^7.5.0"},"peerDependencies":{"@prisma/client":"^5.0.0 || ^6.0.0 || ^7.0.0"},"_npmOperationalInternal":{"tmp":"tmp/orm-prisma_3.3.0_1774539109671_0.6662395903543472","host":"s3://npm-registry-packages-npm-production"}},"4.0.0":{"name":"@cerbos/orm-prisma","version":"4.0.0","keywords":["cerbos","prisma","orm","authorization","permissions"],"author":{"url":"https://cerbos.dev","name":"Cerbos","email":"help@cerbos.dev"},"license":"Apache-2.0","_id":"@cerbos/orm-prisma@4.0.0","maintainers":[{"name":"alexolivier","email":"alex@alexolivier.me"},{"name":"ahaines","email":"andrew@haines.org.nz"}],"homepage":"https://cerbos.dev","bugs":{"url":"https://github.com/cerbos/query-plan-adapters/issues"},"dist":{"shasum":"0fa192ae1d34b4564f77615c47859fa15322608e","tarball":"https://registry.npmjs.org/@cerbos/orm-prisma/-/orm-prisma-4.0.0.tgz","fileCount":56,"integrity":"sha512-SQEQ0VpsPEOxEnk2BFSZv/SvYdpytaJvEAXrfyRJhNEaBxSDXuREx6dBhwodaraWFdSimGIeRedk9d+YjN16RQ==","signatures":[{"sig":"MEYCIQDY7sQIitYvSWAfxJomNeElBLSpkbAPih/VKcnPRmjAeQIhAPPH1EzExYJLxkDZ9qJ3Hq4LYG3Ibb7bOqBPn6iXXNJQ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@cerbos%2form-prisma@4.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2647394},"main":"./lib/index.js","types":"./lib/index.d.ts","engines":{"node":">=22.0.0"},"exports":{".":{"types":"./lib/index.d.ts","default":"./lib/index.js"}},"gitHead":"ce12efd072208614fda8242b2a1aba748d987b45","scripts":{"test":"npm run test:v7","build":"tsc --build","clean":"rimraf lib","cerbos":"cerbos server --config=./cerbos-config.yaml","prepare":"npm run build","test:v6":"node node_modules/prisma-v6/build/index.js db push --force-reset --skip-generate --schema=prisma/schema.v6.prisma && PRISMA_VERSION=6 cerbos run --log-level=error --set=storage.disk.directory=../policies --set=telemetry.disabled=true -- jest src/index.test.ts","test:v7":"node node_modules/prisma/build/index.js db push --force-reset && PRISMA_VERSION=7 cerbos run --log-level=error --set=storage.disk.directory=../policies --set=telemetry.disabled=true -- jest src/index.test.ts","version":"git add -A src","typecheck":"npm run typecheck:v7 && npm run typecheck:v6","typecheck:v6":"tsc -p tsconfig.typecheck.v6.json","typecheck:v7":"tsc -p tsconfig.typecheck.json","prisma:generate":"bash scripts/generate-clients.sh all","test:adversarial":"npm run test:adversarial:v7","prisma:generate:v6":"bash scripts/generate-clients.sh 6","prisma:generate:v7":"bash scripts/generate-clients.sh 7","test:adversarial:v6":"npm run prisma:generate:v6 && node node_modules/prisma-v6/build/index.js db push --force-reset --skip-generate --schema=prisma/schema.adversarial.v6.prisma && PRISMA_VERSION=6 cerbos run --log-level=error --set=storage.disk.directory=../conformance/policies --set=telemetry.disabled=true -- jest --config jest.adversarial.config.js","test:adversarial:v7":"npm run prisma:generate:v7 && node node_modules/prisma/build/index.js db push --force-reset --schema=prisma/schema.adversarial.prisma --url=file:./prisma/dev-adversarial.db && PRISMA_VERSION=7 cerbos run --log-level=error --set=storage.disk.directory=../conformance/policies --set=telemetry.disabled=true -- jest --config jest.adversarial.config.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:c000c4fc-e88e-4f67-8064-51f32295ad9a"}},"overrides":{"@prisma/dev":{"@hono/node-server":"^2.0.0"}},"repository":{"url":"git+https://github.com/cerbos/query-plan-adapters.git","type":"git","directory":"packages/prisma"},"_npmVersion":"12.0.2","description":"Prisma adapter for Cerbos query plans","directories":{},"_nodeVersion":"24.18.0","dependencies":{"@cerbos/core":"^0.32.0","@cerbos/grpc":"^0.28.0"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"prisma":"^7.5.0","rimraf":"^6.0.0","ts-jest":"^29.4.6","ts-node":"^10.4.0","prisma-v6":"npm:prisma@^6.0.0","typescript":"^6.0.0","@types/jest":"^30.0.0","@types/node":"^24.0.0","expect-type":"^1.1.0","@jest/globals":"^30.2.0","@prisma/client":"^7.5.0","@tsconfig/node24":"^24.0.3","@prisma/client-v6":"npm:@prisma/client@^6.0.0","@tsconfig/strictest":"^2.0.8","@prisma/adapter-better-sqlite3":"^7.5.0"},"peerDependencies":{"@prisma/client":"^5.0.0 || ^6.0.0 || ^7.0.0"},"_npmOperationalInternal":{"tmp":"tmp/orm-prisma_4.0.0_1785773076181_0.5031921980661942","host":"s3://npm-registry-packages-npm-production"}},"4.1.0":{"name":"@cerbos/orm-prisma","version":"4.1.0","homepage":"https://cerbos.dev","description":"Prisma adapter for Cerbos query plans","repository":{"type":"git","url":"git+https://github.com/cerbos/query-plan-adapters.git","directory":"packages/prisma"},"bugs":{"url":"https://github.com/cerbos/query-plan-adapters/issues"},"author":{"name":"Cerbos","email":"help@cerbos.dev","url":"https://cerbos.dev"},"license":"Apache-2.0","main":"./lib/index.js","types":"./lib/index.d.ts","exports":{".":{"types":"./lib/index.d.ts","default":"./lib/index.js"}},"publishConfig":{"access":"public","provenance":true},"//test":"`test` is the translator unit test: offline, so no Cerbos sidecar, no `db push`, and no generated client. It is also engine-agnostic — it produces where-inputs and never hands one to a Prisma client — which is why it has no v6/v7 split. Only `test:adversarial*` needs a PDP and a store.","scripts":{"clean":"rimraf lib","build":"tsc --build","typecheck":"npm run typecheck:v7 && npm run typecheck:v6","typecheck:v6":"tsc -p tsconfig.typecheck.v6.json","typecheck:v7":"tsc -p tsconfig.typecheck.json","prepare":"npm run build","version":"git add -A src","prisma:generate":"bash scripts/generate-clients.sh all","prisma:generate:v6":"bash scripts/generate-clients.sh 6","prisma:generate:v7":"bash scripts/generate-clients.sh 7","test":"jest","test:adversarial":"npm run test:adversarial:v7","test:adversarial:v6":"npm run prisma:generate:v6 && node node_modules/prisma-v6/build/index.js db push --force-reset --skip-generate --schema=prisma/schema.adversarial.v6.prisma && PRISMA_VERSION=6 cerbos run --log-level=error --set=storage.disk.directory=../conformance/policies --set=telemetry.disabled=true -- jest --config jest.adversarial.config.js","test:adversarial:v7":"npm run prisma:generate:v7 && node node_modules/prisma/build/index.js db push --force-reset --schema=prisma/schema.adversarial.prisma --url=file:./prisma/dev-adversarial.db && PRISMA_VERSION=7 cerbos run --log-level=error --set=storage.disk.directory=../conformance/policies --set=telemetry.disabled=true -- jest --config jest.adversarial.config.js","test:adversarial:postgres":"npm run test:adversarial:postgres:v7","test:adversarial:postgres:v6":"npm run prisma:generate:v6 && ADAPTER_TEST_DB=postgres PRISMA_VERSION=6 cerbos run --log-level=error --set=storage.disk.directory=../conformance/policies --set=telemetry.disabled=true -- jest --config jest.adversarial.config.js","test:adversarial:postgres:v7":"npm run prisma:generate:v7 && ADAPTER_TEST_DB=postgres PRISMA_VERSION=7 cerbos run --log-level=error --set=storage.disk.directory=../conformance/policies --set=telemetry.disabled=true -- jest --config jest.adversarial.config.js"},"engines":{"node":">=22.0.0"},"devDependencies":{"@jest/globals":"^30.2.0","@prisma/adapter-better-sqlite3":"^7.5.0","@prisma/adapter-pg":"^7.5.0","@prisma/client":"^7.5.0","@prisma/client-v6":"npm:@prisma/client@^6.0.0","@testcontainers/postgresql":"^12.1.0","@tsconfig/node24":"^24.0.3","@tsconfig/strictest":"^2.0.8","@types/jest":"^30.0.0","@types/node":"^24.0.0","expect-type":"^1.1.0","prisma":"^7.5.0","prisma-v6":"npm:prisma@^6.0.0","rimraf":"^6.0.0","ts-jest":"^29.4.6","ts-node":"^10.4.0","typescript":"^6.0.0"},"peerDependencies":{"@prisma/client":"^5.0.0 || ^6.0.0 || ^7.0.0"},"dependencies":{"@cerbos/core":"^0.33.0","@cerbos/grpc":"^0.29.0"},"overrides":{"@prisma/dev":{"@hono/node-server":"^2.0.0"}},"keywords":["cerbos","prisma","orm","authorization","permissions"],"gitHead":"1091fccf06eee77c4628d0562e32ca9cf5eaebf4","_id":"@cerbos/orm-prisma@4.1.0","_nodeVersion":"24.19.0","_npmVersion":"12.0.2","dist":{"integrity":"sha512-oIG9l+VIEj0LwBmmDa3o7oISfvDrF12pje/g+5yzRMkUR0b5NfPnVV0BQFy/8RT2TEN3zhrl5sde66HZ7CKrXg==","shasum":"47e87a2587d5ca4c0879c4938a7531f000f1abc8","tarball":"https://registry.npmjs.org/@cerbos/orm-prisma/-/orm-prisma-4.1.0.tgz","fileCount":59,"unpackedSize":2734790,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@cerbos%2form-prisma@4.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCHvzF38oOEz9rg5sCMJZq+yMzf9C5Of2LC9xzJo+DxvQIgWUWsQZW4H+uegcHUYZ6l1M8vx6GnWRMtO3R2FGIWgVk="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:c000c4fc-e88e-4f67-8064-51f32295ad9a"}},"directories":{},"maintainers":[{"name":"alexolivier","email":"alex@alexolivier.me"},{"name":"ahaines","email":"andrew@haines.org.nz"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/orm-prisma_4.1.0_1786723671869_0.4308446152640897"},"_hasShrinkwrap":false}},"time":{"created":"2022-06-15T10:31:36.100Z","modified":"2026-08-14T16:07:52.403Z","0.1.1":"2022-06-15T10:31:36.330Z","0.1.2":"2022-09-07T14:44:02.055Z","0.1.4":"2022-09-26T10:22:57.732Z","1.0.0-alpha.0":"2022-09-26T14:20:04.539Z","1.0.0":"2022-09-27T22:16:57.778Z","1.1.0-alpha.1":"2023-06-28T20:34:54.736Z","1.1.0":"2023-07-13T14:46:46.313Z","1.1.1":"2023-07-19T09:35:03.552Z","2.0.0-alpha.1":"2025-02-21T12:44:08.494Z","2.0.0-alpha.2":"2025-02-22T18:52:58.231Z","2.0.0":"2025-02-25T09:08:40.057Z","2.0.1":"2025-02-25T10:03:07.033Z","3.0.1":"2025-11-17T17:42:10.526Z","3.1.0":"2026-01-16T10:14:40.234Z","3.1.1":"2026-02-02T12:52:30.448Z","3.2.0":"2026-02-02T12:52:55.112Z","3.2.1":"2026-02-02T17:22:15.067Z","3.3.0":"2026-03-26T15:31:49.920Z","4.0.0":"2026-08-03T16:04:36.375Z","4.1.0":"2026-08-14T16:07:52.042Z"},"bugs":{"url":"https://github.com/cerbos/query-plan-adapters/issues"},"author":{"name":"Cerbos","email":"help@cerbos.dev","url":"https://cerbos.dev"},"license":"Apache-2.0","homepage":"https://cerbos.dev","keywords":["cerbos","prisma","orm","authorization","permissions"],"repository":{"type":"git","url":"git+https://github.com/cerbos/query-plan-adapters.git","directory":"packages/prisma"},"description":"Prisma adapter for Cerbos query plans","maintainers":[{"name":"alexolivier","email":"alex@alexolivier.me"},{"name":"ahaines","email":"andrew@haines.org.nz"}],"readme":"# Cerbos + Prisma ORM Adapter\n\nAn adapter library that takes a [Cerbos](https://cerbos.dev) Query Plan ([PlanResources API](https://docs.cerbos.dev/cerbos/latest/api/index.html#resources-query-plan)) response and converts it into a [Prisma](https://prisma.io) where clause object. This is designed to work alongside a project using the [Cerbos Javascript SDK](https://github.com/cerbos/cerbos-sdk-javascript).\n\n## Features\n\n### Supported Operators\n\n#### Basic Operators\n\n- Logical operators: `and`, `or`, `not`\n- Comparison operators: `eq`, `ne`, `lt`, `gt`, `lte`, `gte`, `in`\n- String operations: `startsWith`, `endsWith`, `contains`\n- Null checks: `eq`/`ne` against a null value map to `{ equals: null }` / `{ not: null }`. The\n  Cerbos planner emits no existence operator — `R.attr.x != null` arrives as a plain `ne`.\n\n#### Relation Operators\n\n- One-to-one: `is`, `isNot`\n- One-to-many/Many-to-many: `some`, `none`, `every`\n- Collection operators: `exists`, `all`, `except` (`exists_one` requires counting matches,\n  which Prisma where-filters cannot express — it throws rather than silently degrading to\n  `exists`; `filter` only appears inside other expressions)\n- Set operations: `hasIntersection`\n\n#### Arithmetic\n\n- `add`, `sub`, `mult`, `div` with a constant side are solved algebraically to a plain column\n  comparison: `R.attr.aNumber + 1 > 2` → `{ aNumber: { gt: 1 } }` (Prisma where-filters cannot\n  express column arithmetic). Multiplying/dividing by a negative constant mirrors directional\n  operators. Arithmetic on both sides of a comparison, division BY a column, and equality or\n  inequality over fractional addition throw. The latter cannot be solved reversibly in IEEE-754\n  arithmetic.\n- String concatenation solving: `P.attr.context == \"projects:\" + R.attr.id` → `{ id: { equals: \"123\" } }`\n\n#### Field-to-field comparisons\n\nComparisons between two columns of the same model compile to\n[Prisma field references](https://www.prisma.io/docs/orm/reference/prisma-client-reference#compare-columns-in-the-same-table).\nPass the Prisma model name via the `model` option (root columns) or `relation.model` in the\nmapper (columns of a related model inside a collection expression). Comparisons across models\nthrow — Prisma only supports references between fields of the same model.\n\n#### Hierarchy Operators\n\n- `hierarchy(string)`, `hierarchy(string, delimiter)`, `hierarchy([segments])`\n- `overlaps`: segment-wise prefix comparison between two hierarchies\n- `ancestorOf` / `descendentOf`: strict prefix relationship between hierarchies\n\n#### Advanced Features\n\n- Deep nested relations support\n- Automatic field inference\n- Collection mapping and filtering\n- Complex condition combinations\n- Type-safe field mappings\n- Timestamp comparisons against Prisma `DateTime` columns. Mark the field mapping with\n  `valueType: \"dateTime\"`; applying `timestamp()` to an untyped/string mapping throws.\n  Literals must be strict RFC 3339 instants in CEL's supported year 0001–9999 range and\n  exactly representable at millisecond precision (fractional digits after the third may\n  only be zero). The mapped column/database must preserve that precision.\n- Outer-column references inside collection expressions (e.g.\n  `R.attr.tags.exists(t, t.name == \"x\" && R.attr.aBool)`) are hoisted or case-split so every\n  filter lands on the model it belongs to\n- Three-valued-logic guards for nullable element columns: mark a relation field as\n  `nullable: true` in the mapper and collection macros (`all`, negated `exists`,\n  `hasIntersection` over `map`) exclude rows whose elements hold `NULL` in that column,\n  matching Cerbos's treatment of a missing attribute as a deny\n\n#### Known limitations (loud failures, never silently-wrong filters)\n\n- LIKE wildcards: Prisma emits `LIKE` without an `ESCAPE` clause, so `contains`/`startsWith`/\n  `endsWith` with a needle containing `%` or `_`, or with a column-valued needle, throws.\n  (A constant *receiver* with a column needle — `\"a-b\".startsWith(R.attr.x)` — is translated\n  exactly by enumerating candidate needles into an `in` filter.)\n- Hierarchy prefixes: `ancestorOf`, `descendentOf` and `overlaps` narrow a column with a\n  `startsWith`, so they throw when the constant hierarchy contains `%`, `_` or `[`. `[` is\n  rejected as well as the two LIKE wildcards because SQL Server opens a character class on\n  `[` even when an `ESCAPE` clause is declared, so it cannot be matched literally at all.\n- Counting: `exists_one`, `size()` thresholds other than empty/non-empty, and string-length\n  comparisons throw (`_count` is not supported inside Prisma `where`).\n- Cross-model column comparisons throw (Prisma field references are same-model only).\n  This includes membership between an outer scalar column and a related collection column.\n\n#### Database collation is an authorization invariant\n\nCerbos string comparisons are case-sensitive. Prisma delegates comparison semantics to the\ndatabase collation, so a case-insensitive or accent-insensitive collation can make a generated\nauthorization filter return rows that Cerbos would deny. Treat the database collation used by\nmapped authorization columns as part of the policy contract:\n\n- PostgreSQL: use a deterministic, case-sensitive collation and avoid `citext` or an\n  insensitive Prisma query mode for mapped fields.\n- MySQL/MariaDB: choose a case-sensitive (`_cs`) or binary collation rather than the common\n  case-insensitive (`_ci`) defaults.\n- SQL Server: use a case-sensitive (`_CS_`) collation rather than a case-insensitive (`_CI_`)\n  collation.\n- SQLite: do not apply `COLLATE NOCASE` to mapped fields, and **also set\n  `PRAGMA case_sensitive_like = ON`** — see below.\n\n**On SQLite, collation is not enough.** `contains`, `startsWith` and `endsWith` lower to `LIKE`,\nand SQLite's `LIKE` is case-insensitive for ASCII *regardless of the column's collation*: a\n`COLLATE BINARY` column answers `= 'one'` case-sensitively and `LIKE '%one%'` case-insensitively\nin the same query. Only `PRAGMA case_sensitive_like = ON` changes it, and the pragma is\nper-connection, so it must be set on every connection the application uses — not once at schema\ncreation.\n\nThat distinction is why this was missed for so long: the corpus's `cs-eq` action proved equality\nwas case-sensitive on SQLite, and equality is the one operator collation *does* govern. The\n`cs-contains`, `cs-startswith` and `cs-endswith` actions now prove the string operators\nseparately, and without the pragma this adapter over-grants every one of them on SQLite.\n\nThe adapter cannot override a column's collation, or set a pragma, from inside a Prisma `where`\nfilter. See Prisma's\n[case-sensitivity documentation](https://docs.prisma.io/docs/orm/v6/prisma-client/queries/case-sensitivity)\nfor provider-specific details.\n\n### NULL attribute representation\n\n`R.attr.x == null` compiles to the same `eq(x, null)` plan node however your application represents\na NULL column in the attributes it sends to `check()`, so the adapter cannot infer the convention\nand has to be told which one you use.\n\n| attributes you send for a NULL column | `check()` on that row | `IS NULL` filter |\n| --- | --- | --- |\n| `{\"x\": null}` — explicit null | allow | selects it — aligned |\n| `{}` — attribute omitted | **deny** (CEL missing-attribute error) | selects it — **over-grants** |\n\n`nullAttributeRepresentation` defaults to `\"explicit\"`, preserving the historical `IS NULL`\ntranslation. If your application omits attributes for NULL columns, set it to `\"omitted\"`: the\nadapter then rejects every null comparison operand instead of emitting a filter that returns rows\nthe PDP denies.\n\n```ts\nqueryPlanToPrisma({ queryPlan, mapper, nullAttributeRepresentation: \"omitted\" });\n```\n\nThe rejection is deliberately wider than the shapes that actually over-grant — `x != null` and\n`!(x == null)` are aligned under both conventions — because Prisma applies negation by wrapping\n(`{ NOT: ... }`) rather than pushing it into the leaf, so a leaf cannot tell whether an enclosing\n`not` will flip `IS NOT NULL` back into a NULL-selecting predicate. Rejecting every null operand is\ncorrect under any nesting. See [#302](https://github.com/cerbos/query-plan-adapters/issues/302).\n\n### Declare the convention per attribute\n\nThe option above is a whole-call default, and one policy suite can legitimately use both\nconventions: the same column mapped twice, sent as an explicit null under one attribute name and\nomitted under another. Declare it on the mapping instead and the call-level option only covers what\nthe mapping does not:\n\n```ts\nconst mapper = {\n  // sent as an explicit null when the column is NULL\n  \"request.resource.attr.owner\": {\n    field: \"ownerId\",\n    nullAttributeRepresentation: \"explicit\",\n  },\n  // omitted when the column is NULL — the call-level default applies\n  \"request.resource.attr.department\": { field: \"department\" },\n};\n```\n\nDeclaring `\"explicit\"` asserts two things: the column can be NULL, **and** a NULL reaches `check()`\nas an explicit null. The equality family (`eq`, `ne`, `in`) over that attribute is then rendered so\nit can never be SQL UNKNOWN — CEL holds a null *value* under this convention, so `null != \"x\"` is\nTRUE and the row must come back, while UNKNOWN would drop it under *both* polarities. Ordering and\nstring operators are left alone: a null receiver raises a no-overload error in CEL, which denies\nexactly as UNKNOWN does.\n\nLeaving an attribute undeclared keeps the historical rendering — so nothing changes for a mapping\nthat says nothing, and `!=` against a constant keeps under-granting the NULL rows until you declare\nit.\n\n**Declare both sides of a field-to-field comparison, or neither.** Mixing the conventions across one\ncomparison has no faithful rendering — the declared side needs a definite answer for its NULL, the\nundeclared side needs UNKNOWN — so the adapter throws rather than picking a direction. See\n[#308](https://github.com/cerbos/query-plan-adapters/issues/308) and\n[ADR 0004](../docs/adr/0004-the-null-convention-is-a-property-of-the-attribute.md).\n\n\n### Conformance contract\n\nThe adapter is differentially tested against Cerbos PDP 0.54.0 `checkResource` decisions using 21 hostile seed rows, both Prisma 6 and 7, and both SQLite and PostgreSQL. The Spring Data adapter defines the reference semantics for this compatibility snapshot.\n\n| Classification | Coverage |\n| --- | --- |\n| Oracle-tested | 136 reference actions |\n| Fail-closed | 51 reference actions plus the 10 reference-unsupported shapes (61 actions total) |\n| Representation-dependent | `null-eq-missing` — rejected under `nullAttributeRepresentation: \"omitted\"`; translated as `IS NULL` under the default, which over-grants if the caller omits attributes for NULL columns |\n| Attribute NULL convention | The equality family (`eq`, `ne`, `in`) over an attribute the caller sends as an explicit null renders definitely, so a NULL row is included where CEL's null *value* says it should be. Declare it per attribute — `nullAttributeRepresentation: \"explicit\"` on the mapper entry — or the historical rendering applies and `!=` against a constant under-grants those rows (cerbos/query-plan-adapters#308) |\n| Known planner divergence | `has()` on a missing attribute is folded by the Cerbos planner to `ALWAYS_ALLOWED`, while `checkResource` denies the missing-attribute rows. Until the planner is fixed, use `R.attr.x != null` for database-backed attributes instead of `has(R.attr.x)` |\n\nThe fail-closed set consists of literal `LIKE` cases Prisma cannot escape safely, cross-model field references, arbitrary relation counts and string lengths, `exists_one`, unsolved column arithmetic, sub-millisecond `now()` thresholds, the reference probes for regex, ordered indexing, and `timestamp()` over a string field, `mod`, a positional read of a scalar list, and list equality over a `map()` projection. Supported timestamp plans require a mapper entry with `valueType: \"dateTime\"` and a strict, millisecond-exact RFC 3339 literal in CEL's supported instant range. These shapes throw instead of producing a broader authorization filter. Every fail-closed shape's error message is pinned in the shared corpus (`conformance/actions.json`) and asserted by this adapter's conformance run, so a classification proves the throw names its declared mechanism rather than merely that something threw.\n\nThe `where` input each of these actions produces is pinned separately, in the translator unit test (`npm test`) — every corpus action, classified there exactly once as an emitted filter, an unconditional plan kind, or a throw. That is what makes a change to the emitted SQL show up as a diff even when it selects the same rows from the corpus seeds.\n\n#### Providers the contract is proved on\n\nThe classification above holds where the corpus is **executed**, not where the emitted filter merely looks plausible. Until [#320](https://github.com/cerbos/query-plan-adapters/issues/320) it was executed on SQLite only, and the Prisma 6/7 matrix is an *engine* matrix, not a provider one — it says nothing about how a provider coerces a value or reads a `LIKE` pattern. The suite now runs on SQLite and PostgreSQL:\n\nThe store and the Prisma major are independent dimensions, so there are four runs and CI does all four:\n\n```bash\nnpm run test:adversarial:v7            # SQLite,     Prisma 7\nnpm run test:adversarial:v6            # SQLite,     Prisma 6\nnpm run test:adversarial:postgres:v7   # PostgreSQL, Prisma 7  (testcontainers)\nnpm run test:adversarial:postgres:v6   # PostgreSQL, Prisma 6  (testcontainers)\n```\n\nMySQL, SQL Server and CockroachDB are **not** executed. Where a fail-closed reason names one of them, it is reasoned from that provider's documented `LIKE` and escaping behaviour rather than observed.\n\n> **Breaking change in this release.** `endsWith`/`contains`/`startsWith` with a needle containing a **backslash**, and hierarchy prefixes containing one, now throw instead of returning a filter. A backslash is the default `LIKE` escape character on PostgreSQL and MySQL and has no meaning at all on SQLite, so one needle meant two different things: `contains(\"a\\\\b\")` matched `\"ab\"` on PostgreSQL — a row the PDP denies — and `endsWith(\"\\\\\")` failed the query outright with `SQLSTATE 22025`. There is no needle spelling that is correct on every provider without an `ESCAPE` clause Prisma does not emit, so the shape is refused. If you match on backslashes, compare the whole value with `==` or move the predicate out of the policy.\n\n### Mapping hazards\n\nThe conformance contract above proves the *plan* side — given a policy shape, does the filter select the rows `check()` allows. The other half is the *mapping*: **the records the nested filter reads must be the records the application put into the resource attributes.** Six ways that can break are catalogued in the shared corpus, and every adapter has to record a position on each of them.\n\nThis adapter names a Prisma relation, so the mapping *looks* as though the ORM will apply the application's own narrowing to the nested `some`/`every`/`none`. **It will not.** Prisma has no schema-level filtered relation and no `@Where` equivalent; a `where` injected by a client extension or by `$extends`/middleware rewrites the top-level query and leaves nested relation filters untouched. In corpus terms this adapter is class 1 — a **bare-table subquery** — despite naming a relation.\n\nWhere the application narrows its own reads of a related model, declare the same predicate as [`subqueryFilter`](#declaring-the-applications-own-predicate) on the relation and the adapter reproduces it. Declaring nothing emits exactly the filter this adapter emitted before the field existed — it cannot detect the omission, so silence is not a warning.\n\n| Hazard | Position | Mechanism to check |\n|---|---|---|\n| Filtered association | **Caller-owned**, reproducible with `subqueryFilter` | A `$extends`/`$use` client extension or middleware that injects a `where` for the related model, or a repository helper that always appends one. None of them rewrite the nested filter this adapter returns |\n| Default scope on the target model | **Caller-owned**, reproducible with `subqueryFilter` | A soft-delete column (`deletedAt: null`), a tenant column, a `published` flag — anything every application read of the related model filters on. Prisma has no default-scope construct, so the convention lives in your own query code and only you can see it |\n| Subtype discrimination | **Caller-owned**, reproducible with `subqueryFilter` | A `type`/`kind` discriminator column where one model holds several row kinds. Declare `{ type: \"…\" }` |\n| To-one relation used as a collection | **Rejected by Prisma** | A `type: \"one\"` mapping compiles to `is`, an argument Prisma only accepts on a relation its own schema declares to-one, and `@relation(references: …)` must already point at a unique field. Mapping a to-many relation as `type: \"one\"` is therefore a query-validation error from Prisma, not a silently wider subquery |\n| Composite association key | **Reproduced by Prisma** | Prisma resolves multi-column foreign keys itself from `@relation(fields: […], references: […])`. The mapping names the relation, never its columns, so there is no key for the adapter to get wrong |\n| Absent to-one parent | **Reproduced**, and proved by the corpus (`w1-all-chain`, `rel-not-bool-hop` and siblings) | None — every operator reached through a relation requires its to-one hops separately, so a missing parent stays denied under both polarities ([#309](https://github.com/cerbos/query-plan-adapters/issues/309), [#315](https://github.com/cerbos/query-plan-adapters/issues/315), [#375](https://github.com/cerbos/query-plan-adapters/issues/375)). **Behaviour change in #375:** this previously held only for a chain of two or more relations. A negation over a SINGLE to-one hop — `!R.attr.parent.aBool` against a `type: \"one\"` mapping — returned every row whose relation was absent. It now emits `AND: [{ parent: { is: {} } }, { NOT: … }]` and returns fewer rows: an over-grant fix, and consumer-visible for any policy with that shape |\n\n#### Declaring the application's own predicate\n\n```ts\nconst result = queryPlanToPrisma({\n  queryPlan,\n  mapper: {\n    \"request.resource.attr.tags\": {\n      relation: {\n        name: \"tags\",\n        type: \"many\",\n        field: \"name\",\n        // Exactly the predicate your own reads of `Tag` apply.\n        subqueryFilter: { deletedAt: null, kind: \"label\" },\n      },\n    },\n  },\n});\n```\n\n`subqueryFilter` is a Prisma where-input over the *related* model. It is ANDed into the nested filter, so it narrows the records the subquery *examines* rather than the records it requires, and it applies to every operator reached through the relation — `exists`, `all`, `except`, membership, `hasIntersection`, emptiness checks — and to the hop-existence guard, so an intermediate hop must exist *and* be visible.\n\n`all()` is the one operator that cannot simply absorb the predicate: `every: AND(declared, P)` would *require* every record to satisfy the declaration, which is the opposite of ignoring what the application hides. It is rewritten to `none: AND(declared, NOT P)` — no visible record violates `P`. Note the consequence, which is correct rather than surprising: if the declaration hides every record of a relation, `all()` over it is vacuously true, exactly as it is for the application, which sends `check()` an empty list for the same reason.\n\n## Requirements\n\n- Cerbos > v0.40\n- `@cerbos/http` or `@cerbos/grpc` client\n- Prisma >= v6.0 (v7 supported)\n\n## System Requirements\n\n- Node.js >= 22.0.\n- Prisma CLI & Client >= 6.0 (v7 supported)\n- A database supported by Prisma (SQLite/PostgreSQL/MySQL/etc.) so the Prisma client can communicate with stored data\n\n## Installation\n\n```bash\nnpm install @cerbos/orm-prisma\n```\n\n## Usage\n\nThe package exports a function:\n\n```ts\nimport { queryPlanToPrisma, PlanKind } from \"@cerbos/orm-prisma\";\n\nqueryPlanToPrisma({\n  queryPlan,                // The Cerbos query plan response\n  mapper,                   // Map Cerbos field names to Prisma field names\n}): {\n  kind: PlanKind,\n  filters?: any             // Prisma where conditions\n}\n```\n\n### Basic Example\n\n1. Create a basic policy file in the `policies` directory:\n\n```yaml\napiVersion: api.cerbos.dev/v1\nresourcePolicy:\n  resource: resource\n  version: default\n  rules:\n    - actions: [\"view\"]\n      effect: EFFECT_ALLOW\n      roles: [\"USER\"]\n      condition:\n        match:\n          expr: request.resource.attr.status == \"active\"\n```\n\n2. Start Cerbos PDP:\n\n```bash\ndocker run --rm -i -p 3592:3592 -v $(pwd)/policies:/policies ghcr.io/cerbos/cerbos:latest\n```\n\n3. Create Prisma schema (`prisma/schema.prisma`):\n\n```prisma\ndatasource db {\n  provider = \"sqlite\"\n  url      = env(\"DATABASE_URL\")\n}\n\ngenerator client {\n  provider = \"prisma-client-js\"\n}\n\nmodel Resource {\n  id     Int     @id @default(autoincrement())\n  title  String\n  status String\n}\n```\n\n4. Implement the mapper\n\n```ts\nimport { GRPC as Cerbos } from \"@cerbos/grpc\";\nimport { PrismaClient } from \"@prisma/client\";\nimport { queryPlanToPrisma, PlanKind } from \"@cerbos/orm-prisma\";\n\nconst prisma = new PrismaClient();\nconst cerbos = new Cerbos(\"localhost:3592\", { tls: false });\n\n// Fetch query plan from Cerbos\nconst queryPlan = await cerbos.planResources({\n  principal: { id: \"user1\", roles: [\"USER\"] },\n  resource: { kind: \"resource\" },\n  action: \"view\",\n});\n\n// Convert query plan to Prisma filters\nconst result = queryPlanToPrisma({\n  queryPlan,\n  mapper: {\n    \"request.resource.attr.title\": { field: \"title\" },\n    \"request.resource.attr.status\": { field: \"status\" },\n  },\n});\n\nif (result.kind === PlanKind.ALWAYS_DENIED) {\n  return [];\n}\n\n// Use filters in Prisma query\nconst records = await prisma.resource.findMany({\n  where: result.filters,\n});\n\n// Use filters in Prisma query with other conditions\nconst records = await prisma.resource.findMany({\n  where: {\n    AND: [\n      {\n        status: \"DRAFT\"\n      },\n      result.filters,\n    ]\n});\n```\n\n### Collection Operators\n\nThe adapter understands the full Cerbos collection operator set, including `except`. For example, the configuration below ensures a resource’s categories do not have any sub-category named `finance`:\n\n```ts\nconst result = queryPlanToPrisma({\n  queryPlan,\n  mapper: {\n    \"request.resource.attr.categories\": {\n      relation: {\n        name: \"categories\",\n        type: \"many\",\n        fields: {\n          subCategories: {\n            relation: {\n              name: \"subCategories\",\n              type: \"many\",\n              fields: {\n                name: { field: \"name\" },\n              },\n            },\n          },\n        },\n      },\n    },\n  },\n});\n```\n\n`queryPlanToPrisma` emits the necessary nested `NOT` structure so Prisma receives a valid filter for the entire relation chain.\n\n### Field Name Mapping\n\nFields can be mapped using either an object or a function:\n\n```ts\n// Object mapping\nconst result = queryPlanToPrisma({\n  queryPlan,\n  mapper: {\n    \"request.resource.attr.fieldName\": { field: \"prismaFieldName\" },\n  },\n});\n\n// Function mapping\nconst result = queryPlanToPrisma({\n  queryPlan,\n  mapper: (fieldName) => ({\n    field: fieldName.replace(\"request.resource.attr.\", \"\"),\n  }),\n});\n```\n\n### Relations Mapping\n\nRelations are mapped with their types and optional field configurations. Fields can be automatically inferred from the path if not explicitly mapped.\n\nThe nested filters this produces read the related model unfiltered — Prisma has no schema-level filtered relation, and an injected `where` does not reach them. If your own reads of that model apply a predicate, declare it as `subqueryFilter` on the relation. See [Mapping hazards](#mapping-hazards).\n\n```ts\nconst result = queryPlanToPrisma({\n  queryPlan,\n  mapper: {\n    // Simple relation mapping - fields will be inferred\n    \"request.resource.attr.owner\": {\n      relation: {\n        name: \"owner\",\n        type: \"one\", // \"one\" for one-to-one, \"many\" for one-to-many\n      },\n    },\n\n    // Relation with explicit field mapping\n    \"request.resource.attr.tags\": {\n      relation: {\n        name: \"tags\",\n        type: \"many\",\n        field: \"name\", // Optional: specify field for direct comparisons\n      },\n    },\n\n    // Relation with nested field mappings\n    \"request.resource.attr.nested\": {\n      relation: {\n        name: \"nested\",\n        type: \"one\",\n        fields: {\n          // Optional: specify mappings for nested fields\n          aBool: { field: \"aBool\" },\n          aNumber: { field: \"aNumber\" },\n        },\n      },\n    },\n  },\n});\n```\n\n### Field Inference Example\n\nWhen using relations, fields are automatically inferred from the path unless explicitly mapped:\n\n```ts\n// These mappers are equivalent for handling: request.resource.attr.nested.aNumber\n{\n  \"request.resource.attr.nested\": {\n    relation: {\n      name: \"nested\",\n      type: \"one\",\n      fields: {\n        aNumber: { field: \"aNumber\" }\n      }\n    }\n  }\n}\n\n// Shorter version - aNumber will be inferred from the path\n{\n  \"request.resource.attr.nested\": {\n    relation: {\n      name: \"nested\",\n      type: \"one\"\n    }\n  }\n}\n```\n\n### Handling `in` Operators\n\n`queryPlanToPrisma` normalises Cerbos `in` expressions to match Prisma expectations:\n\n- Single values become equality comparisons (`{ field: \"value\" }`).\n- Arrays remain `{ field: { in: [...] } }`.\n- Relation-backed fields retain their relation structure while still applying the appropriate equality or `in` operator at the leaf.\n\n### Complex Example with Multiple Relations and Direct Fields\n\n```ts\nconst result = queryPlanToPrisma({\n  queryPlan,\n  mapper: {\n    \"request.resource.attr.status\": { field: \"status\" },\n    \"request.resource.attr.owner\": {\n      relation: {\n        name: \"owner\",\n        type: \"one\",\n      },\n    },\n    \"request.resource.attr.tags\": {\n      relation: {\n        name: \"tags\",\n        type: \"many\",\n        field: \"name\",\n      },\n    },\n  },\n});\n\n// Results in Prisma filters like:\nconst result = await primsa.resource.findMany({\n  where: {\n    AND: [\n      { status: { equals: \"active\" } },\n      { owner: { is: { id: { equals: \"user1\" } } } },\n      { tags: { some: { name: { in: [\"tag1\", \"tag2\"] } } } },\n    ];\n  }\n})\n```\n\n### Complex Examples\n\n#### Lambda Expression Examples\n\n```ts\n// Using exists with lambda expressions\nconst result = queryPlanToPrisma({\n  queryPlan,\n  mapper: {\n    \"request.resource.attr.comments\": {\n      relation: {\n        name: \"comments\",\n        type: \"many\",\n        fields: {\n          author: {\n            relation: {\n              name: \"author\",\n              type: \"one\",\n            },\n          },\n          status: { field: \"status\" },\n        },\n      },\n    },\n  },\n});\n\n// This can handle complex exists queries like:\n// \"Does the resource have any approved comments by specific users?\"\nconst result = await primsa.resource.findMany({\n  where: {\n    comments: {\n      some: {\n        AND: [\n          { status: { equals: \"approved\" } },\n          {\n            author: {\n              is: {\n                id: { in: [\"user1\", \"user2\"] },\n              },\n            },\n          },\n        ],\n      },\n    },\n  },\n});\n```\n\n## Development\n\n### Running Tests\n\n```bash\nnpm test\n```\n\nThis is the **translator unit test**: for every action in the shared conformance corpus, the `where` input this adapter emits. It reads its plans from `conformance/wire-fixtures/` — the golden `PlanResources` responses captured against the pinned Cerbos version — so it needs no Cerbos sidecar, no database, and no generated Prisma client, and it is engine-agnostic (there is no v6/v7 split). It also pins the shapes the adapter refuses, with the message `conformance/actions.json` records, and the parts of the mapper contract no policy can reach: the `nullAttributeRepresentation` boundary, `subqueryFilter`, and malformed input.\n\nEvery wire fixture must be classified there exactly once, so adding a corpus action fails this suite until someone records the filter it produces. See [ADR 0006](../docs/adr/0006-translator-unit-tests-take-their-plans-from-wire-fixtures.md).\n\nWhether those filters return the rows the PDP allows is a separate question, answered by the adversarial suite — see [Conformance contract](#conformance-contract) above, which lists the four runs and what each one covers. That suite does need a Cerbos sidecar, and resets `prisma/dev-adversarial.db` with `prisma db push --force-reset`, so run it only against disposable development databases.\n\n## Types\n\n### Query Plan Response Types\n\nThe adapter is fully typed and provides clear type definitions for all responses:\n\n```ts\nimport { PlanKind, QueryPlanToPrismaResult } from \"@cerbos/orm-prisma\";\n\n// The result will be one of these types:\ntype QueryPlanToPrismaResult =\n  | {\n      kind: PlanKind.ALWAYS_ALLOWED | PlanKind.ALWAYS_DENIED;\n    }\n  | {\n      kind: PlanKind.CONDITIONAL;\n      filters: Record<string, any>;\n    };\n\n// Example usage with type narrowing:\nconst result = queryPlanToPrisma({ queryPlan });\n\nif (result.kind === PlanKind.CONDITIONAL) {\n  // TypeScript knows `filters` exists here\n  const records = await prisma.resource.findMany({\n    where: result.filters,\n  });\n} else if (result.kind === PlanKind.ALWAYS_ALLOWED) {\n  // No filters needed\n  const records = await prisma.resource.findMany();\n} else {\n  // Must be ALWAYS_DENIED\n  return [];\n}\n```\n\n### Mapper Types\n\nThe mapper configuration is also fully typed:\n\n```ts\ntype MapperConfig = {\n  field?: string;\n  valueType?: \"dateTime\";\n  nullable?: boolean;\n  relation?: {\n    name: string;\n    type: \"one\" | \"many\";\n    model?: string;\n    field?: string;\n    fields?: {\n      [key: string]: MapperConfig; // Recursive for nested fields\n    };\n  };\n};\n\ntype Mapper = { [key: string]: MapperConfig } | ((key: string) => MapperConfig);\n```\n\n## Full Example\n\nA complete example application using this adapter can be found at [https://github.com/cerbos/express-prisma-cerbos](https://github.com/cerbos/express-prisma-cerbos)\n\nThis repository also carries a runnable [`example/`](example/), which installs the adapter from the\nartifact `npm publish` would upload and exercises it against a live PDP over the shared\n[demo domain](../demo/README.md):\n\n```bash\n# from the repository root\ndemo/scripts/run-example.sh prisma\n```\n\nUnlike the test suites, it resolves the adapter through its **published** surface — the `exports`\nmap, `types`, the `files` allowlist, and the peer range — and covers usage shapes past a single\nflat query: pagination, and the adapter's filter composed with an application-owned filter.\n\n## Resources\n\n### Documentation\n\n- [Cerbos Documentation](https://docs.cerbos.dev)\n- [Prisma Documentation](https://www.prisma.io/docs)\n- [Query Plan API Reference](https://docs.cerbos.dev/cerbos/latest/api/index.html#resources-query-plan)\n\n### Examples and Tutorials\n\n- [Express + Prisma + Cerbos Example](https://github.com/cerbos/express-prisma-cerbos)\n- [Cerbos Query Planning Guide](https://docs.cerbos.dev/cerbos/latest/policies/compile.html)\n- [Prisma Filtering Guide](https://www.prisma.io/docs/concepts/components/prisma-client/filtering-and-sorting)\n\n### Related Projects\n\n- [Cerbos JavaScript SDK](https://github.com/cerbos/cerbos-sdk-javascript)\n\n### Community\n\n- [Cerbos Slack](https://community.cerbos.dev)\n- [Cerbos GitHub Discussions](https://github.com/cerbos/cerbos/discussions)\n\n## License\n\nApache 2.0.\n","readmeFilename":"README.md"}