permdock 0.0.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (344) hide show
  1. package/README.md +327 -1
  2. package/dist/a2a/index.d.ts +169 -0
  3. package/dist/a2a/index.js +232 -0
  4. package/dist/adapter-context-mlWsVGGg.js +23 -0
  5. package/dist/ai-sdk/index.d.ts +95 -0
  6. package/dist/ai-sdk/index.js +154 -0
  7. package/dist/approval-required-TzNB9oQA.js +6 -0
  8. package/dist/approvals/index.d.ts +3 -0
  9. package/dist/approvals/index.js +5 -0
  10. package/dist/approvals-DbYAuNkG.js +224 -0
  11. package/dist/approvers-DT4AVyIg.js +52 -0
  12. package/dist/arazzo-BAgw9ap6.js +70 -0
  13. package/dist/arazzo-cmvX2jDe.js +54 -0
  14. package/dist/authzen/index.d.ts +39 -0
  15. package/dist/authzen/index.js +302 -0
  16. package/dist/better-auth/index.d.ts +109 -0
  17. package/dist/better-auth/index.js +344 -0
  18. package/dist/better-supabase/index.d.ts +206 -0
  19. package/dist/better-supabase/index.js +620 -0
  20. package/dist/bind-CVy3Espv.d.ts +25 -0
  21. package/dist/bind-VnYn2HKq.js +97 -0
  22. package/dist/boundary-BM8a_P6E.js +13 -0
  23. package/dist/boundary-BmHxVH1J.d.ts +15 -0
  24. package/dist/budget-JqcRqyhK.d.ts +11 -0
  25. package/dist/budget-NbEtbJC_.js +11 -0
  26. package/dist/canonical-json-DemiK4Vp.js +26 -0
  27. package/dist/capability-4qPdO9gk.js +173 -0
  28. package/dist/capability-Dq43tT1u.d.ts +99 -0
  29. package/dist/catalog/index.d.ts +12 -0
  30. package/dist/catalog/index.js +2 -0
  31. package/dist/catalog-BjZSovXQ.js +2 -0
  32. package/dist/catalog-doc-Dsc9y7sd.js +309 -0
  33. package/dist/catalog-h2tlKFkq.js +48 -0
  34. package/dist/catalog-path-CnI0XTFK.js +12 -0
  35. package/dist/catalog-z8q6bi_r.js +55 -0
  36. package/dist/claude-agent/index.d.ts +72 -0
  37. package/dist/claude-agent/index.js +77 -0
  38. package/dist/clerk/index.d.ts +65 -0
  39. package/dist/clerk/index.js +301 -0
  40. package/dist/cli/bin.d.ts +1 -0
  41. package/dist/cli/bin.js +20 -0
  42. package/dist/cli/index.d.ts +46 -0
  43. package/dist/cli/index.js +5 -0
  44. package/dist/clients-C7zLFuWT.d.ts +12 -0
  45. package/dist/clients-DjU5ABMy.js +23 -0
  46. package/dist/cloud/index.d.ts +90 -0
  47. package/dist/cloud/index.js +404 -0
  48. package/dist/cloud-BGhHS-lY.js +50 -0
  49. package/dist/cloud-Bo3e9Ak3.js +118 -0
  50. package/dist/collect-DDDv_ESs.js +502 -0
  51. package/dist/collect-DLlujdHC.js +83 -0
  52. package/dist/collect-rG2IQ3t0.js +2 -0
  53. package/dist/commands-DWOrSQic.js +97 -0
  54. package/dist/compact-y6vfu2_f.js +19 -0
  55. package/dist/compare-pfyVnBjE.js +12 -0
  56. package/dist/compile/index.d.ts +3 -0
  57. package/dist/compile/index.js +2 -0
  58. package/dist/compile-Ba4blROR.js +613 -0
  59. package/dist/compile-CNnl6uIt.d.ts +94 -0
  60. package/dist/config-BJiM-xAm.js +157 -0
  61. package/dist/config-Bn00Z3ks.js +36 -0
  62. package/dist/config-report-Dw_JcUqT.js +44 -0
  63. package/dist/connection-CU8MQxRi.js +194 -0
  64. package/dist/context-Ttp0ekMT.js +82 -0
  65. package/dist/convex/index.d.ts +45 -0
  66. package/dist/convex/index.js +65 -0
  67. package/dist/create-BWyx3jua.d.ts +245 -0
  68. package/dist/create-CPhDL6qx.js +253 -0
  69. package/dist/credential-8P81ff4u.js +306 -0
  70. package/dist/delegation-D8pUEuce.js +103 -0
  71. package/dist/describe-B_gVZEVi.js +94 -0
  72. package/dist/describe-PdoqESvg.d.ts +36 -0
  73. package/dist/diff-B8Tunc3o.js +451 -0
  74. package/dist/diff-CzqLxZ77.js +48 -0
  75. package/dist/digest-B3kc_PgQ.d.ts +19 -0
  76. package/dist/digest-BI-6aa6d.js +27 -0
  77. package/dist/doctor-WpvG6p4k.js +1194 -0
  78. package/dist/doctor-collect-ByfYlNv1.js +664 -0
  79. package/dist/doctor-rOr-4ZfS.js +53 -0
  80. package/dist/drizzle/index.d.ts +73 -0
  81. package/dist/drizzle/index.js +160 -0
  82. package/dist/duration-xK2jGFVc.js +25 -0
  83. package/dist/elysia/index.d.ts +49 -0
  84. package/dist/elysia/index.js +59 -0
  85. package/dist/errors-CWfoNg9N.js +47 -0
  86. package/dist/errors-Cz5zn0mW.js +123 -0
  87. package/dist/errors-DAqevpNk.d.ts +125 -0
  88. package/dist/errors-DRnGZHzF.js +30 -0
  89. package/dist/evaluation-items-CfCCejQd.js +40 -0
  90. package/dist/evaluations-tz6D9A2G.js +461 -0
  91. package/dist/eve/index.d.ts +86 -0
  92. package/dist/eve/index.js +176 -0
  93. package/dist/expiry-BoBJ8Tvc.js +7 -0
  94. package/dist/express/index.d.ts +23 -0
  95. package/dist/express/index.js +78 -0
  96. package/dist/fastify/index.d.ts +33 -0
  97. package/dist/fastify/index.js +92 -0
  98. package/dist/fields-BMl1RxoX.js +26 -0
  99. package/dist/files-DWUN9PzI.js +125 -0
  100. package/dist/fixtures-ht28Cplr.js +67 -0
  101. package/dist/freeze-CrU8nQeX.js +60 -0
  102. package/dist/from-snapshot-C3sHpZNS.js +569 -0
  103. package/dist/generate-CH7ThJ14.js +173 -0
  104. package/dist/grantee-Cv5Sogfv.js +602 -0
  105. package/dist/graph-sql-B-dsAT6j.d.ts +29 -0
  106. package/dist/headers-BZSDieNT.js +6 -0
  107. package/dist/headers-Cf-zWvsO.d.ts +6 -0
  108. package/dist/helpers-H_KARDVC.js +421 -0
  109. package/dist/hono/index.d.ts +48 -0
  110. package/dist/hono/index.js +99 -0
  111. package/dist/hosted-DJQw46hn.js +266 -0
  112. package/dist/http-BIhmLfCc.js +95 -0
  113. package/dist/http-DPuDaChb.d.ts +13 -0
  114. package/dist/http-SO7qGttf.js +44 -0
  115. package/dist/ids-DC4V4CFu.js +18 -0
  116. package/dist/index-A0YNL8jZ.d.ts +177 -0
  117. package/dist/index-CtE07CBF.d.ts +6 -0
  118. package/dist/index-D3vbkoSI.d.ts +483 -0
  119. package/dist/index-D6_cSa1z.d.ts +201 -0
  120. package/dist/index.d.ts +16 -0
  121. package/dist/index.js +26 -0
  122. package/dist/instance-options-BK_rNOSC.d.ts +11 -0
  123. package/dist/instance-options-Dhhcnm3y.js +22 -0
  124. package/dist/json-schema-BsAflUGW.js +106 -0
  125. package/dist/jwt/index.d.ts +91 -0
  126. package/dist/jwt/index.js +590 -0
  127. package/dist/kernel-GSQnMz3O.js +208 -0
  128. package/dist/kysely/index.d.ts +78 -0
  129. package/dist/kysely/index.js +129 -0
  130. package/dist/live-options-H2eG8dfJ.js +60 -0
  131. package/dist/load-DhWEB9P1.js +75 -0
  132. package/dist/load-DwJUafYN.js +2 -0
  133. package/dist/load-jose-BL6LH4bL.js +11 -0
  134. package/dist/lru-8q4WZjBV.js +28 -0
  135. package/dist/manifest-iaoBXHKc.js +783 -0
  136. package/dist/manifest-uDS9y5de.d.ts +206 -0
  137. package/dist/map-AcxK9o_D.js +147 -0
  138. package/dist/map-claims-Z4QZOiFF.js +369 -0
  139. package/dist/map-error-pgUWNNtG.js +23 -0
  140. package/dist/markers-B0hYLvMD.js +60 -0
  141. package/dist/may-use-DndQ5tQ-.js +77 -0
  142. package/dist/mcp/index.d.ts +159 -0
  143. package/dist/mcp/index.js +603 -0
  144. package/dist/nest/index.d.ts +75 -0
  145. package/dist/nest/index.js +261 -0
  146. package/dist/next/client.d.ts +23 -0
  147. package/dist/next/client.js +33 -0
  148. package/dist/next/index.d.ts +93 -0
  149. package/dist/next/index.js +180 -0
  150. package/dist/next/plugin.d.ts +14 -0
  151. package/dist/next/plugin.js +33 -0
  152. package/dist/node/index.d.ts +24 -0
  153. package/dist/node/index.js +34 -0
  154. package/dist/openai/index.d.ts +62 -0
  155. package/dist/openai/index.js +92 -0
  156. package/dist/openapi/index.d.ts +176 -0
  157. package/dist/openapi/index.js +3 -0
  158. package/dist/openapi-Bbg4wGVL.js +164 -0
  159. package/dist/openapi-BqRBvAng.js +538 -0
  160. package/dist/openapi-CqqEbHsL.js +250 -0
  161. package/dist/openapi-import-cmwetbzw.js +5959 -0
  162. package/dist/openapi-schema--ARjyfQr.js +6902 -0
  163. package/dist/orpc/index.d.ts +51 -0
  164. package/dist/orpc/index.js +145 -0
  165. package/dist/otel/index.d.ts +13 -0
  166. package/dist/otel/index.js +202 -0
  167. package/dist/package-root-zGkxO3oN.js +30 -0
  168. package/dist/parse-BuyjxhZV.js +53 -0
  169. package/dist/parse-local-manifest-BkGQNzAh.d.ts +10 -0
  170. package/dist/parse-local-manifest-BrMozJCo.js +36 -0
  171. package/dist/pdp/index.d.ts +22 -0
  172. package/dist/pdp/index.js +682 -0
  173. package/dist/peer-BOr_kJE1.js +31 -0
  174. package/dist/permdock-CzqXjCpU.js +3471 -0
  175. package/dist/permissions-CDgvKG5L.d.ts +52 -0
  176. package/dist/permissions-CpZrivYv.js +142 -0
  177. package/dist/permissions-DVoF6dMt.js +662 -0
  178. package/dist/permissions-DttnqqxC.d.ts +214 -0
  179. package/dist/pins-8ILTftC9.js +12 -0
  180. package/dist/policy-CFZAr_Al.d.ts +2252 -0
  181. package/dist/policy-D8UFyERw.d.ts +20 -0
  182. package/dist/policy-xyWg7QdR.js +1122 -0
  183. package/dist/powersync-A8x_Yyvh.js +2 -0
  184. package/dist/powersync-C7kLglqX.js +540 -0
  185. package/dist/powersync-yW1UUFzp.js +62 -0
  186. package/dist/prisma/index.d.ts +136 -0
  187. package/dist/prisma/index.js +455 -0
  188. package/dist/problem-B43ztKIm.js +191 -0
  189. package/dist/problem-details-CkL50EEf.d.ts +7 -0
  190. package/dist/problem-details-_AMOYz-w.js +144 -0
  191. package/dist/prompt-CXYhLfsS.js +32 -0
  192. package/dist/protected-CNsMzrVd.d.ts +27 -0
  193. package/dist/protected-Cs6kTaHo.js +100 -0
  194. package/dist/protected-bZs6rbT1.d.ts +40 -0
  195. package/dist/provider-Cjr62YMV.d.ts +6 -0
  196. package/dist/provider-DLzpb2Xz.js +52 -0
  197. package/dist/provider-store-DNyC1y48.js +43 -0
  198. package/dist/react/index.d.ts +8 -0
  199. package/dist/react/index.js +7 -0
  200. package/dist/react/provider-client.d.ts +2 -0
  201. package/dist/react/provider-client.js +3 -0
  202. package/dist/react-native/index.d.ts +198 -0
  203. package/dist/react-native/index.js +696 -0
  204. package/dist/refs-KYb4ntaz.js +91 -0
  205. package/dist/relations-cjOL01hZ.js +505 -0
  206. package/dist/replay-BsOyTrdV.js +28 -0
  207. package/dist/replay-sqBGMnNs.d.ts +5 -0
  208. package/dist/resource-ref-CaS9yVPi.js +20 -0
  209. package/dist/revocations-Bhr0aMIC.js +27 -0
  210. package/dist/revocations-Cy06JNx2.d.ts +21 -0
  211. package/dist/rls-BMNydpHk.js +2521 -0
  212. package/dist/rls-CEvs64Kj.js +238 -0
  213. package/dist/rls-fields-BMasREhR.js +3502 -0
  214. package/dist/rls-graph-pc9fuXYm.js +435 -0
  215. package/dist/rls-import-D8F7j35Q.js +943 -0
  216. package/dist/rls-migrate-7wikfrVI.js +367 -0
  217. package/dist/rls-ownership-B5Lkq62W.js +843 -0
  218. package/dist/rls-shared-aOQ4hGTO.js +493 -0
  219. package/dist/rls-verify-D8B7dOTh.js +745 -0
  220. package/dist/row-check-Dt35czLy.d.ts +40 -0
  221. package/dist/rpc-DOK54_CS.js +89 -0
  222. package/dist/run-YXCJDNYk.js +174 -0
  223. package/dist/runtime-CB8gQFvS.js +11 -0
  224. package/dist/saas-Bj_FFkjN.js +1203 -0
  225. package/dist/schema-D3MnDMxa.js +300 -0
  226. package/dist/scim/index.d.ts +2 -0
  227. package/dist/scim/index.js +2 -0
  228. package/dist/scim-BFGBBAqR.js +1445 -0
  229. package/dist/scopes-CVdPrWN-.js +239 -0
  230. package/dist/server/index.d.ts +134 -0
  231. package/dist/server/index.js +11 -0
  232. package/dist/server-DlZ28Oz5.js +268 -0
  233. package/dist/sha256-BO0swRXL.js +150 -0
  234. package/dist/shared-DRu8VFVM.js +123 -0
  235. package/dist/sink-Bd9PSyfq.js +141 -0
  236. package/dist/sink-Gs6TTVa-.d.ts +104 -0
  237. package/dist/skills-Biq5uup3.js +192 -0
  238. package/dist/skills-JaymNCdK.js +56 -0
  239. package/dist/snapshot-Enxd0n-s.js +975 -0
  240. package/dist/snapshot-cache-D6jLelln.js +44 -0
  241. package/dist/snapshot-cache-DwQH8ufx.d.ts +45 -0
  242. package/dist/solid/index.d.ts +93 -0
  243. package/dist/solid/index.js +188 -0
  244. package/dist/sources-B0UvrJ21.js +534 -0
  245. package/dist/sources-BcJgw0lt.d.ts +192 -0
  246. package/dist/sql-xdg5f4Fi.js +27 -0
  247. package/dist/src-CSbUiozF.js +568 -0
  248. package/dist/ssf/index.d.ts +4 -0
  249. package/dist/ssf/index.js +596 -0
  250. package/dist/store-DMAWwAJV.js +371 -0
  251. package/dist/store-D_pjn91-.d.ts +36 -0
  252. package/dist/store-options-yO0V6gRn.js +716 -0
  253. package/dist/stores-4_sqiOA1.js +87 -0
  254. package/dist/stores-DVR5NHLE.d.ts +52 -0
  255. package/dist/stream-DDpvynSB.js +66 -0
  256. package/dist/stream-DlvG2hs-.d.ts +12 -0
  257. package/dist/style-CTm1AXDT.js +22 -0
  258. package/dist/subject-C6dLxqHU.js +24 -0
  259. package/dist/subject-settings-BwBmCdTR.js +128 -0
  260. package/dist/supabase/index.d.ts +183 -0
  261. package/dist/supabase/index.js +5 -0
  262. package/dist/supabase/middleware.d.ts +82 -0
  263. package/dist/supabase/middleware.js +102 -0
  264. package/dist/supabase-CwafwxxF.js +83 -0
  265. package/dist/supabase-DTBaC20O.js +774 -0
  266. package/dist/supabase-config-Bs44dare.js +472 -0
  267. package/dist/supabase-hook-BuxLQLpU.js +1814 -0
  268. package/dist/supabase-hook-D5qVd_D8.js +2 -0
  269. package/dist/supautils-DYZnzRWV.js +91 -0
  270. package/dist/svelte/PermissionBoundary.svelte +37 -0
  271. package/dist/svelte/Protected.svelte +40 -0
  272. package/dist/svelte/index.d.ts +13 -0
  273. package/dist/svelte/index.js +107 -0
  274. package/dist/svelte/runtime.d.ts +7 -0
  275. package/dist/svelte/runtime.js +4 -0
  276. package/dist/svelte/source.d.ts +13 -0
  277. package/dist/svelte/source.js +11 -0
  278. package/dist/terminal/index.d.ts +163 -0
  279. package/dist/terminal/index.js +833 -0
  280. package/dist/testing/index.d.ts +745 -0
  281. package/dist/testing/index.js +3672 -0
  282. package/dist/testing/saas/index.d.ts +194 -0
  283. package/dist/testing/saas/index.js +3 -0
  284. package/dist/testing/saas/permissions.d.ts +2 -0
  285. package/dist/testing/saas/permissions.js +2 -0
  286. package/dist/text-diff-BdkkYSbi.js +15 -0
  287. package/dist/thenable-okc2xDsj.js +10 -0
  288. package/dist/timeout-D51niuQP.js +8 -0
  289. package/dist/token-CIWxJOCh.js +50 -0
  290. package/dist/trpc/index.d.ts +61 -0
  291. package/dist/trpc/index.js +122 -0
  292. package/dist/types-9AWO9EGt.d.ts +197 -0
  293. package/dist/types-BPxgszlT.d.ts +550 -0
  294. package/dist/types-BVyImy5I.d.ts +120 -0
  295. package/dist/types-Bvc4oWT6.d.ts +9 -0
  296. package/dist/types-C3s9xVJG.d.ts +48 -0
  297. package/dist/types-Dnemwd77.d.ts +183 -0
  298. package/dist/types-kxznc7cn.d.ts +52 -0
  299. package/dist/types-vKyAMtcX.d.ts +157 -0
  300. package/dist/types-vNSDF7Dq.d.ts +66 -0
  301. package/dist/types-yF5LmQVD.d.ts +306 -0
  302. package/dist/unplugin/index.d.ts +7 -0
  303. package/dist/unplugin/index.js +31 -0
  304. package/dist/usage-D07N9QJ3.js +42 -0
  305. package/dist/usage-D82l1CwK.js +2 -0
  306. package/dist/usage-DG1oeCca.js +693 -0
  307. package/dist/validation-error-CnjZ4t92.js +33 -0
  308. package/dist/validation-error-CtF23SrC.d.ts +26 -0
  309. package/dist/validity-uOp8UpYn.js +245 -0
  310. package/dist/verifier-BxBo6I44.js +466 -0
  311. package/dist/version-BvacVTZR.js +17 -0
  312. package/dist/views-Soe7bGSC.js +95 -0
  313. package/dist/vocabulary-DA8a8zif.d.ts +56 -0
  314. package/dist/vue/index.d.ts +79 -0
  315. package/dist/vue/index.js +196 -0
  316. package/dist/watch-Etoa_Mvr.js +2 -0
  317. package/dist/watch-UihESpsJ.js +128 -0
  318. package/dist/webmcp/index.d.ts +75 -0
  319. package/dist/webmcp/index.js +307 -0
  320. package/package.json +450 -5
  321. package/rulesets/permdock.yaml +29 -0
  322. package/schemas/approval-request-v1.json +175 -0
  323. package/schemas/catalog-v1.json +535 -0
  324. package/schemas/openapi/oas-3.1.json +1298 -0
  325. package/schemas/openapi/oas-3.2.json +1516 -0
  326. package/schemas/openapi/overlay-1.1.json +79 -0
  327. package/schemas/supabase-claims-v1.json +144 -0
  328. package/schemas/supabase-manifest-v1.json +361 -0
  329. package/skills/permdock/SKILL.md +66 -0
  330. package/skills/permdock-agents/SKILL.md +77 -0
  331. package/skills/permdock-agents/references/runtimes.md +213 -0
  332. package/skills/permdock-approvals/SKILL.md +80 -0
  333. package/skills/permdock-approvals/references/stores-and-resume.md +94 -0
  334. package/skills/permdock-audit/SKILL.md +67 -0
  335. package/skills/permdock-credentials/SKILL.md +55 -0
  336. package/skills/permdock-credentials/references/tokens-keys-links.md +132 -0
  337. package/skills/permdock-data/SKILL.md +57 -0
  338. package/skills/permdock-data/references/queries-and-rls.md +62 -0
  339. package/skills/permdock-data/references/relationships.md +67 -0
  340. package/skills/permdock-tenancy/SKILL.md +80 -0
  341. package/skills/permdock-tenancy/references/ownership-and-custom-roles.md +89 -0
  342. package/skills/permdock-wire/SKILL.md +116 -0
  343. package/skills/permdock-wire/references/adapters.md +492 -0
  344. package/skills/permdock-wire/references/policy-options.md +45 -0
@@ -0,0 +1,136 @@
1
+ import { Ir as Condition, Pr as Subject, mn as WhereResult } from "../policy-CFZAr_Al.js";
2
+ import { r as RelationsMapping } from "../graph-sql-B-dsAT6j.js";
3
+ import { n as WithSubjectOptions, t as RowCheck } from "../row-check-Dt35czLy.js";
4
+ //#region src/prisma/model-fields.d.ts
5
+ /** A model's non-nullable scalar fields and its scalar list fields, by Prisma field name. */
6
+ type PrismaModelFields = {
7
+ readonly required: readonly string[];
8
+ readonly lists: readonly string[];
9
+ };
10
+ /** The `datamodel` of Prisma's DMMF (`getDMMF`, or a generator's `options.dmmf.datamodel`). */
11
+ type PrismaDatamodel = {
12
+ readonly models: readonly {
13
+ readonly name: string;
14
+ readonly fields: readonly {
15
+ readonly name: string;
16
+ readonly kind: string;
17
+ readonly isRequired: boolean;
18
+ readonly isList: boolean;
19
+ }[];
20
+ }[];
21
+ };
22
+ /**
23
+ * Reads a model's required and list fields from `schema.prisma` text or a DMMF datamodel, for
24
+ * the `model` option of `toWhere` and `toPredicate`. Relation fields are skipped.
25
+ */
26
+ export declare function prismaModelFields(datamodel: string | PrismaDatamodel, model: string): PrismaModelFields;
27
+ //#endregion
28
+ //#region src/prisma/to-where.d.ts
29
+ type PrismaWhereOptions = {
30
+ readonly fields?: Readonly<Record<string, string>>;
31
+ readonly subject?: Subject;
32
+ readonly now?: number;
33
+ readonly listFields?: readonly string[];
34
+ readonly requiredFields?: readonly string[];
35
+ /** Required and list fields read from the schema by `prismaModelFields`; adds to `requiredFields` and `listFields`. */
36
+ readonly model?: PrismaModelFields;
37
+ };
38
+ export declare function toWhere<T extends Record<string, unknown> = Record<string, unknown>>(input: Condition | WhereResult, options?: PrismaWhereOptions): T;
39
+ export declare function permdockExtension(): {
40
+ readonly name: "permdock";
41
+ readonly query: {
42
+ readonly $allModels: Record<string, (args: {
43
+ readonly args: Record<string, unknown>;
44
+ readonly query: (next: Record<string, unknown>) => Promise<unknown>;
45
+ }) => Promise<unknown>>;
46
+ };
47
+ };
48
+ type PrismaTransactionClient = {
49
+ $executeRawUnsafe(query: string, ...values: unknown[]): Promise<number>;
50
+ };
51
+ type PrismaLike<Tx> = {
52
+ $transaction<T>(fn: (tx: Tx) => Promise<T>): Promise<T>;
53
+ };
54
+ /**
55
+ * Runs `fn` in an interactive transaction whose role and claims are `permdock.subject`'s, so
56
+ * the generated RLS policies decide for the same subject as the in-process checks.
57
+ */
58
+ export declare function withSubject<Tx extends PrismaTransactionClient, T>(prisma: PrismaLike<Tx>, permdock: {
59
+ readonly subject: Subject;
60
+ }, fn: (tx: Tx) => Promise<T>, options?: WithSubjectOptions): Promise<T>;
61
+ type PrismaDelegate = {
62
+ findFirst(args: {
63
+ readonly where: Record<string, unknown>;
64
+ }): Promise<unknown>;
65
+ };
66
+ /**
67
+ * Checks one row by its unique key, for `findUnique`, `update` and `delete`, which take no
68
+ * filter: `{ found: false }` when `unique` matches nothing, otherwise whether the permission
69
+ * filter keeps the row. One query when granted, two otherwise.
70
+ */
71
+ export declare function checkRow(delegate: PrismaDelegate, input: Condition | WhereResult, unique: Record<string, unknown>, options?: PrismaWhereOptions): Promise<RowCheck>;
72
+ //#endregion
73
+ //#region src/prisma/predicate.d.ts
74
+ /** A Prisma 8 ORM field proxy: `u.email` inside `.where((u) => ...)`. */
75
+ type PrismaFieldProxy = {
76
+ eq(value: unknown): unknown;
77
+ neq(value: unknown): unknown;
78
+ gt(value: unknown): unknown;
79
+ gte(value: unknown): unknown;
80
+ lt(value: unknown): unknown;
81
+ lte(value: unknown): unknown;
82
+ like(pattern: string): unknown;
83
+ in(values: readonly unknown[]): unknown;
84
+ isNull(): unknown;
85
+ isNotNull(): unknown;
86
+ };
87
+ /** `import { and, or, not } from '@prisma/orm-postgres/orm-client'`. */
88
+ type PrismaCombinators = {
89
+ readonly and: (...predicates: unknown[]) => unknown;
90
+ readonly or: (...predicates: unknown[]) => unknown;
91
+ readonly not: (predicate: unknown) => unknown;
92
+ };
93
+ type PrismaPredicateOptions = {
94
+ readonly fields?: Readonly<Record<string, string>>;
95
+ readonly subject?: Subject;
96
+ readonly now?: number;
97
+ /** Required and list fields from `prismaModelFields`; `contains` on a list field is refused. */
98
+ readonly model?: PrismaModelFields;
99
+ readonly listFields?: readonly string[];
100
+ /** A non-null column (the primary key) that spells constant true and false. Default `id`. */
101
+ readonly key?: string;
102
+ /** Loaded from `@prisma/orm-postgres/orm-client` by default. */
103
+ readonly combinators?: PrismaCombinators;
104
+ };
105
+ type Model = Readonly<Record<string, PrismaFieldProxy>>;
106
+ /**
107
+ * Compiles a condition into a Prisma 8 ORM predicate: pass the result to
108
+ * `db.orm.<ns>.<Model>.where(...)`. No grant compiles to a predicate that matches no row.
109
+ */
110
+ export declare function toPredicate<M = Model>(input: Condition | WhereResult, options?: PrismaPredicateOptions): (model: M) => unknown;
111
+ //#endregion
112
+ //#region src/conditions/resolve-related.d.ts
113
+ type ResolveRelatedOptions = {
114
+ /**
115
+ * Runs one Postgres query with `$1`-style placeholders and returns its
116
+ * rows; each row's `id` is an id the filtered field may hold. With Prisma:
117
+ * `({ sql, values }) => prisma.$queryRawUnsafe(sql, ...values)`.
118
+ */
119
+ readonly run: (query: {
120
+ readonly sql: string;
121
+ readonly values: readonly unknown[];
122
+ }) => Promise<readonly Readonly<Record<string, unknown>>[]>;
123
+ /** Where the relation graph lives. */
124
+ readonly relations?: RelationsMapping;
125
+ /** Turns an id (always text) into the field's type, e.g. `Number` for an integer key. */
126
+ readonly parse?: (id: string, field: string) => unknown;
127
+ };
128
+ /**
129
+ * `where` with every `related` node replaced by the ids it reaches, read in
130
+ * one query per node, so an ORM without raw subqueries (Prisma) filters the
131
+ * graph with a plain `in`. The ids are read now: run the filtered query right
132
+ * after, in the same transaction when the graph may change in between.
133
+ */
134
+ export declare function resolveRelated(where: WhereResult, options: ResolveRelatedOptions): Promise<WhereResult>;
135
+ //#endregion
136
+ export type { PrismaCombinators, PrismaDatamodel, PrismaFieldProxy, PrismaModelFields, PrismaPredicateOptions, PrismaWhereOptions, ResolveRelatedOptions, RowCheck, WithSubjectOptions };
@@ -0,0 +1,455 @@
1
+ import { t as compact } from "../compact-y6vfu2_f.js";
2
+ import { n as freezeDeep } from "../freeze-CrU8nQeX.js";
3
+ import { w as assertSafeKey } from "../permissions-DVoF6dMt.js";
4
+ import { n as PermDockValidationError } from "../validation-error-CnjZ4t92.js";
5
+ import { a as relatedRowGuard, l as renderGraphSql, n as escapeLike, s as relatedTargetsSql, t as compileWhere, u as restrictedRowsSql } from "../compile-Ba4blROR.js";
6
+ import { a as rowCheckOf, n as statementText, r as subjectStatements } from "../subject-settings-BwBmCdTR.js";
7
+ //#region src/prisma/to-where.ts
8
+ function fieldTests(options) {
9
+ const mapped = (field) => fieldName(field, options.fields);
10
+ return {
11
+ required: (field) => options.requiredFields?.includes(field) === true || options.model?.required.includes(mapped(field)) === true,
12
+ list: (field) => options.listFields?.includes(field) === true || options.model?.lists.includes(mapped(field)) === true
13
+ };
14
+ }
15
+ const EMPTY_OR = { OR: [] };
16
+ function fieldName(field, fields) {
17
+ assertSafeKey(field, "condition field");
18
+ return fields?.[field] ?? field;
19
+ }
20
+ const NEVER = { kind: "never" };
21
+ const ALWAYS = { kind: "always" };
22
+ function foldRequired(node, required) {
23
+ switch (node.kind) {
24
+ case "isNull":
25
+ if (!required(node.field)) return node;
26
+ return node.negated ? ALWAYS : NEVER;
27
+ case "and": {
28
+ const items = node.items.map((item) => foldRequired(item, required)).filter((item) => item.kind !== "always");
29
+ if (items.some((item) => item.kind === "never")) return NEVER;
30
+ return items.length === 0 ? ALWAYS : items.length === 1 ? items[0] : {
31
+ kind: "and",
32
+ items
33
+ };
34
+ }
35
+ case "or": {
36
+ const items = node.items.map((item) => foldRequired(item, required)).filter((item) => item.kind !== "never");
37
+ if (items.some((item) => item.kind === "always")) return ALWAYS;
38
+ return items.length === 0 ? NEVER : items.length === 1 ? items[0] : {
39
+ kind: "or",
40
+ items
41
+ };
42
+ }
43
+ case "not": {
44
+ const item = foldRequired(node.item, required);
45
+ return item.kind === "never" ? ALWAYS : item.kind === "always" ? NEVER : {
46
+ kind: "not",
47
+ item
48
+ };
49
+ }
50
+ case "never":
51
+ case "always":
52
+ case "exists":
53
+ case "compare":
54
+ case "sql": return node;
55
+ /* v8 ignore next 6 */
56
+ default: throw new Error(`PermDock: unknown compiled node '${String(node)}'`);
57
+ }
58
+ }
59
+ function render$1(node, options, tests) {
60
+ switch (node.kind) {
61
+ case "never": return { ...EMPTY_OR };
62
+ case "always": return {};
63
+ case "isNull": {
64
+ const name = fieldName(node.field, options.fields);
65
+ return node.negated ? { [name]: { not: null } } : { [name]: { equals: null } };
66
+ }
67
+ case "and": return { AND: node.items.map((item) => render$1(item, options, tests)) };
68
+ case "or": return { OR: node.items.map((item) => render$1(item, options, tests)) };
69
+ case "not": return { NOT: render$1(node.item, options, tests) };
70
+ /* v8 ignore next 6 */
71
+ case "exists": return { [fieldName(node.rowField, options.fields)]: { in: [] } };
72
+ /* v8 ignore next 2 */
73
+ case "sql": return { ...EMPTY_OR };
74
+ case "compare": {
75
+ const name = fieldName(node.field, options.fields);
76
+ switch (node.op) {
77
+ case "eq": return { [name]: { equals: node.value } };
78
+ case "ne": return { [name]: { not: node.value } };
79
+ case "gt": return { [name]: { gt: node.value } };
80
+ case "gte": return { [name]: { gte: node.value } };
81
+ case "lt": return { [name]: { lt: node.value } };
82
+ case "lte": return { [name]: { lte: node.value } };
83
+ case "in": return { [name]: { in: node.value } };
84
+ case "notIn": return { [name]: { notIn: node.value } };
85
+ case "contains": return tests.list(node.field) ? { [name]: { has: node.value } } : { [name]: { contains: typeof node.value === "string" ? escapeLike(node.value) : node.value } };
86
+ /* v8 ignore next 4 */
87
+ default: {
88
+ const exhaustive = node.op;
89
+ throw new Error(`PermDock: unknown compare '${String(exhaustive)}'`);
90
+ }
91
+ }
92
+ }
93
+ /* v8 ignore next 6 */
94
+ default: throw new Error(`PermDock: unknown compiled node '${String(node)}'`);
95
+ }
96
+ }
97
+ function containsEmptyOr(value) {
98
+ if (value === null || typeof value !== "object") return false;
99
+ if (Array.isArray(value)) return value.some((item) => containsEmptyOr(item));
100
+ const record = value;
101
+ if (Array.isArray(record["OR"]) && record["OR"].length === 0) return true;
102
+ return Object.values(record).some((item) => containsEmptyOr(item));
103
+ }
104
+ function rewriteEmptyOr(args) {
105
+ const where = args["where"];
106
+ if (where === void 0 || !containsEmptyOr(where)) return args;
107
+ return {
108
+ ...args,
109
+ where: {
110
+ AND: [where, EMPTY_OR],
111
+ OR: []
112
+ }
113
+ };
114
+ }
115
+ function toWhere(input, options = {}) {
116
+ const compiled = compileWhere(input, compact({
117
+ subject: options.subject,
118
+ now: options.now
119
+ }));
120
+ const tests = fieldTests(options);
121
+ return render$1(foldRequired(compiled, tests.required), options, tests);
122
+ }
123
+ function wrap({ args, query }) {
124
+ return query(rewriteEmptyOr(args));
125
+ }
126
+ function permdockExtension() {
127
+ return {
128
+ name: "permdock",
129
+ query: { $allModels: {
130
+ findMany: wrap,
131
+ findFirst: wrap,
132
+ findFirstOrThrow: wrap,
133
+ count: wrap,
134
+ aggregate: wrap,
135
+ groupBy: wrap,
136
+ updateMany: wrap,
137
+ deleteMany: wrap
138
+ } }
139
+ };
140
+ }
141
+ /**
142
+ * Runs `fn` in an interactive transaction whose role and claims are `permdock.subject`'s, so
143
+ * the generated RLS policies decide for the same subject as the in-process checks.
144
+ */
145
+ function withSubject(prisma, permdock, fn, options = {}) {
146
+ const statements = subjectStatements(permdock, options);
147
+ return prisma.$transaction(async (tx) => {
148
+ for (const statement of statements) await tx.$executeRawUnsafe(statementText(statement), ...statement.values);
149
+ return fn(tx);
150
+ });
151
+ }
152
+ /**
153
+ * Checks one row by its unique key, for `findUnique`, `update` and `delete`, which take no
154
+ * filter: `{ found: false }` when `unique` matches nothing, otherwise whether the permission
155
+ * filter keeps the row. One query when granted, two otherwise.
156
+ */
157
+ async function checkRow(delegate, input, unique, options = {}) {
158
+ const filter = toWhere(input, options);
159
+ const kept = await delegate.findFirst(rewriteEmptyOr({ where: { AND: [unique, filter] } }));
160
+ if (kept !== null && kept !== void 0) return rowCheckOf(true, true);
161
+ const row = await delegate.findFirst({ where: unique });
162
+ return rowCheckOf(row !== null && row !== void 0, false);
163
+ }
164
+ //#endregion
165
+ //#region src/prisma/predicate.ts
166
+ function loadCombinators(injected) {
167
+ if (injected !== void 0) return injected;
168
+ const loader = globalThis.process?.getBuiltinModule?.("node:module");
169
+ try {
170
+ if (loader === void 0) throw new Error("no module loader");
171
+ return loader.createRequire(import.meta.url)("@prisma/orm-postgres/orm-client");
172
+ } catch {
173
+ throw new Error("PermDock: toPredicate needs @prisma/orm-postgres; pass `combinators` on runtimes without require");
174
+ }
175
+ }
176
+ function refused$1(detail) {
177
+ return new PermDockValidationError({
178
+ code: "non-portable-condition",
179
+ permission: "",
180
+ resource: "",
181
+ boundary: "where",
182
+ message: `PermDock: non-portable-condition: ${detail}`
183
+ });
184
+ }
185
+ function render(node, model, options, ops) {
186
+ const proxy = (field) => {
187
+ assertSafeKey(field, "condition field");
188
+ const name = options.fields?.[field] ?? field;
189
+ assertSafeKey(name, "Prisma field");
190
+ const value = model[name];
191
+ if (value === void 0) throw refused$1(`no field '${name}' on the Prisma model`);
192
+ return value;
193
+ };
194
+ const key = () => proxy(options.key ?? "id");
195
+ switch (node.kind) {
196
+ case "never": return key().isNull();
197
+ case "always": return key().isNotNull();
198
+ case "isNull": return node.negated ? proxy(node.field).isNotNull() : proxy(node.field).isNull();
199
+ case "and": return ops.and(...node.items.map((item) => render(item, model, options, ops)));
200
+ case "or": return ops.or(...node.items.map((item) => render(item, model, options, ops)));
201
+ case "not": return ops.not(render(node.item, model, options, ops));
202
+ /* v8 ignore start */
203
+ case "exists": throw refused$1("memberOf with a memberships table");
204
+ case "sql": throw refused$1("relationship grant; resolve it first with resolveRelated");
205
+ /* v8 ignore stop */
206
+ case "compare": {
207
+ const field = proxy(node.field);
208
+ switch (node.op) {
209
+ case "eq": return field.eq(node.value);
210
+ case "ne": return field.neq(node.value);
211
+ case "gt": return field.gt(node.value);
212
+ case "gte": return field.gte(node.value);
213
+ case "lt": return field.lt(node.value);
214
+ case "lte": return field.lte(node.value);
215
+ case "in": {
216
+ const values = node.value;
217
+ return values.length === 0 ? key().isNull() : field.in(values);
218
+ }
219
+ case "notIn": {
220
+ const values = node.value;
221
+ return values.length === 0 ? key().isNotNull() : ops.not(field.in(values));
222
+ }
223
+ case "contains": {
224
+ const name = options.fields?.[node.field] ?? node.field;
225
+ if (options.listFields?.includes(node.field) === true || options.model?.lists.includes(name) === true) throw refused$1(`contains on the list field '${name}'`);
226
+ if (typeof node.value !== "string") throw refused$1(`contains with a non-string value on '${name}'`);
227
+ return field.like(`%${escapeLike(node.value)}%`);
228
+ }
229
+ /* v8 ignore next 4 */
230
+ default: {
231
+ const exhaustive = node.op;
232
+ throw new Error(`PermDock: unknown compare '${String(exhaustive)}'`);
233
+ }
234
+ }
235
+ }
236
+ /* v8 ignore next 6 */
237
+ default: throw new Error(`PermDock: unknown compiled node '${String(node)}'`);
238
+ }
239
+ }
240
+ /**
241
+ * Compiles a condition into a Prisma 8 ORM predicate: pass the result to
242
+ * `db.orm.<ns>.<Model>.where(...)`. No grant compiles to a predicate that matches no row.
243
+ */
244
+ function toPredicate(input, options = {}) {
245
+ const compiled = compileWhere(input, compact({
246
+ subject: options.subject,
247
+ now: options.now
248
+ }));
249
+ const ops = loadCombinators(options.combinators);
250
+ return (model) => render(compiled, model, options, ops);
251
+ }
252
+ //#endregion
253
+ //#region src/prisma/model-fields.ts
254
+ const BLOCK = /^\s*(model|type|view)\s+([A-Za-z_]\w*)\s*\{/u;
255
+ const FIELD = /^\s*([A-Za-z_]\w*)\s+([A-Za-z_][\w.:]*)(\([^)]*\))?(\[\])?(\?)?/u;
256
+ function fromSchema(schema, model) {
257
+ const lines = schema.split(/\r?\n/u);
258
+ const composite = /* @__PURE__ */ new Set();
259
+ for (const line of lines) {
260
+ const block = BLOCK.exec(line);
261
+ if (block !== null) composite.add(block[2] ?? "");
262
+ }
263
+ const required = [];
264
+ const lists = [];
265
+ let inside = false;
266
+ let found = false;
267
+ for (const line of lines) {
268
+ const code = line.replace(/\/\/.*$/u, "").trim();
269
+ if (!inside) {
270
+ const block = BLOCK.exec(code);
271
+ if (block?.[1] === "model" && block[2] === model) {
272
+ inside = true;
273
+ found = true;
274
+ }
275
+ continue;
276
+ }
277
+ if (code === "}") break;
278
+ if (code === "" || code.startsWith("@@")) continue;
279
+ const field = FIELD.exec(code);
280
+ if (field === null) continue;
281
+ const [, name = "", type = "", , list, optional] = field;
282
+ if (type.includes(":") || composite.has(type)) continue;
283
+ if (list !== void 0) lists.push(name);
284
+ else if (optional === void 0) required.push(name);
285
+ }
286
+ return found ? {
287
+ required,
288
+ lists
289
+ } : void 0;
290
+ }
291
+ function fromDatamodel(datamodel, model) {
292
+ const found = datamodel.models.find((item) => item.name === model);
293
+ if (found === void 0) return;
294
+ const scalars = found.fields.filter((field) => field.kind === "scalar" || field.kind === "enum");
295
+ return {
296
+ required: scalars.filter((field) => field.isRequired && !field.isList).map((field) => field.name),
297
+ lists: scalars.filter((field) => field.isList).map((field) => field.name)
298
+ };
299
+ }
300
+ /**
301
+ * Reads a model's required and list fields from `schema.prisma` text or a DMMF datamodel, for
302
+ * the `model` option of `toWhere` and `toPredicate`. Relation fields are skipped.
303
+ */
304
+ function prismaModelFields(datamodel, model) {
305
+ assertSafeKey(model, "Prisma model");
306
+ const fields = typeof datamodel === "string" ? fromSchema(datamodel, model) : fromDatamodel(datamodel, model);
307
+ if (fields === void 0) throw new Error(`PermDock: Prisma model '${model}' is not in the datamodel`);
308
+ return Object.freeze({
309
+ required: Object.freeze(fields.required),
310
+ lists: Object.freeze(fields.lists)
311
+ });
312
+ }
313
+ //#endregion
314
+ //#region src/conditions/resolve-related.ts
315
+ const NOTHING = {
316
+ op: "or",
317
+ conditions: []
318
+ };
319
+ function notRestricted(column) {
320
+ return {
321
+ op: "or",
322
+ conditions: [{
323
+ op: "eq",
324
+ field: column,
325
+ value: false
326
+ }, {
327
+ op: "isNull",
328
+ field: column,
329
+ value: true
330
+ }]
331
+ };
332
+ }
333
+ function refused(detail) {
334
+ return new PermDockValidationError({
335
+ code: "non-portable-condition",
336
+ permission: "",
337
+ resource: "",
338
+ boundary: "where",
339
+ message: `PermDock: non-portable-condition: ${detail}`
340
+ });
341
+ }
342
+ /**
343
+ * `where` with every `related` node replaced by the ids it reaches, read in
344
+ * one query per node, so an ORM without raw subqueries (Prisma) filters the
345
+ * graph with a plain `in`. The ids are read now: run the filtered query right
346
+ * after, in the same transaction when the graph may change in between.
347
+ */
348
+ async function resolveRelated(where, options) {
349
+ const resources = where.resources;
350
+ const subject = where.subject?.principal?.id;
351
+ async function resolveNode(node) {
352
+ if (resources === void 0) throw refused("related: the where() result carries no resource graph");
353
+ if (node.ids === void 0 && (subject === void 0 || subject === "")) return NOTHING;
354
+ const mapping = {
355
+ ...options.relations,
356
+ resources
357
+ };
358
+ const ids = await readIds(relatedTargetsSql(node, mapping), node.field);
359
+ if (ids.length === 0) return NOTHING;
360
+ const reach = {
361
+ op: "in",
362
+ field: node.field,
363
+ value: ids
364
+ };
365
+ const guard = relatedRowGuard(node);
366
+ const conditions = [reach, ...guard === void 0 ? [] : [notRestricted(guard)]];
367
+ const above = node.restrictedAncestors;
368
+ if (above !== void 0) {
369
+ const closed = await readIds(restrictedRowsSql(above, mapping), above.parent);
370
+ if (closed.length > 0) conditions.push({
371
+ op: "or",
372
+ conditions: [{
373
+ op: "isNull",
374
+ field: above.parent,
375
+ value: true
376
+ }, {
377
+ op: "notIn",
378
+ field: above.parent,
379
+ value: closed
380
+ }]
381
+ });
382
+ }
383
+ return conditions.length === 1 ? reach : {
384
+ op: "and",
385
+ conditions
386
+ };
387
+ }
388
+ async function readIds(parts, field) {
389
+ const query = renderGraphSql(parts, {
390
+ subject: subject ?? "",
391
+ placeholder: (index) => `$${String(index)}`,
392
+ /* v8 ignore next 3 */
393
+ column: (name) => {
394
+ throw refused(`related: no row column '${name}' in an id query`);
395
+ }
396
+ });
397
+ return (await options.run({
398
+ sql: `select distinct r.id from (${query.sql}) r where r.id is not null`,
399
+ values: query.values
400
+ })).flatMap((row) => {
401
+ const id = row["id"];
402
+ if (typeof id !== "string" && typeof id !== "number") return [];
403
+ const text = String(id);
404
+ const parsed = options.parse === void 0 ? text : options.parse(text, field);
405
+ return typeof parsed === "string" || typeof parsed === "number" || typeof parsed === "boolean" ? [parsed] : [];
406
+ });
407
+ }
408
+ async function resolve(node) {
409
+ switch (node.op) {
410
+ case "related": return resolveNode(node);
411
+ case "and":
412
+ case "or": return {
413
+ op: node.op,
414
+ conditions: await Promise.all(node.conditions.map(resolve))
415
+ };
416
+ case "not": return {
417
+ op: "not",
418
+ condition: await resolve(node.condition)
419
+ };
420
+ case "sqlFunction": return {
421
+ ...node,
422
+ twin: await resolve(node.twin)
423
+ };
424
+ case "eq":
425
+ case "ne":
426
+ case "gt":
427
+ case "gte":
428
+ case "lt":
429
+ case "lte":
430
+ case "contains":
431
+ case "in":
432
+ case "notIn":
433
+ case "isNull":
434
+ case "memberOf":
435
+ case "opaque":
436
+ case "liveSession": return node;
437
+ default: return node;
438
+ }
439
+ }
440
+ const out = {
441
+ condition: await resolve(where.condition),
442
+ partial: where.partial
443
+ };
444
+ for (const key of [
445
+ "subject",
446
+ "scopes",
447
+ "resources"
448
+ ]) if (where[key] !== void 0) Object.defineProperty(out, key, {
449
+ value: where[key],
450
+ enumerable: false
451
+ });
452
+ return freezeDeep(out);
453
+ }
454
+ //#endregion
455
+ export { checkRow, permdockExtension, prismaModelFields, resolveRelated, toPredicate, toWhere, withSubject };