permdock 0.6.0 → 0.8.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 (507) hide show
  1. package/README.md +2 -3
  2. package/dist/{2020-C9VN-x8c.js → 2020-CJbO8Bvz.js} +1 -3
  3. package/dist/a2a/index.d.ts +7 -7
  4. package/dist/a2a/index.js +9 -9
  5. package/dist/action-result-CL-QCITA.d.ts +19 -0
  6. package/dist/{adapter-context-CRhqyzCk.js → adapter-context-CIQpQxbE.js} +8 -2
  7. package/dist/{adoption-scan-DCYe60Pi.js → adoption-scan-BLs67P1l.js} +5 -5
  8. package/dist/agent/index.d.ts +3 -3
  9. package/dist/agent/index.js +1 -1
  10. package/dist/ai-sdk/index.d.ts +31 -10
  11. package/dist/ai-sdk/index.js +22 -12
  12. package/dist/{app-data-MuyzVqX8.js → app-data-UNNm07jV.js} +10 -7
  13. package/dist/{approval-header-CJACtHkv.js → approval-header-8QV6MU4H.js} +6 -3
  14. package/dist/{approval-prompt-Dg5LeAcT.js → approval-prompt-B8hQY69x.js} +5 -6
  15. package/dist/{approval-prompt-DvSSPQJX.d.ts → approval-prompt-PYagyQUj.d.ts} +13 -11
  16. package/dist/approvals/index.d.ts +5 -5
  17. package/dist/approvals/index.js +7 -7
  18. package/dist/{approvals-p1PGoVjb.js → approvals-DnIBTuXE.js} +128 -78
  19. package/dist/{approvers-CqPOLD-o.js → approvers-B4r0N_Uz.js} +8 -2
  20. package/dist/{arazzo-41WuzHou.js → arazzo-3RhGfkAK.js} +2 -2
  21. package/dist/{arazzo-CaUVBn7D.js → arazzo-B5-ulWif.js} +6 -6
  22. package/dist/{args-IIolxxKA.js → args-0FrVs5EH.js} +125 -8
  23. package/dist/astro/index.d.ts +30 -12
  24. package/dist/astro/index.js +2 -2
  25. package/dist/{audience-DabClFLQ.js → audience-BAkBDMqn.js} +8 -8
  26. package/dist/{auth-DRLEizbL.js → auth--yPyZNgr.js} +21 -10
  27. package/dist/authzen/index.d.ts +171 -25
  28. package/dist/authzen/index.js +321 -149
  29. package/dist/{automation-BNM3TtDo.d.ts → automation-DqEoWHBc.d.ts} +42 -32
  30. package/dist/{automation-DVjOckjV.js → automation-x3KEUusw.js} +22 -21
  31. package/dist/base-url-BQbddZO5.js +9 -0
  32. package/dist/better-auth/index.d.ts +2 -2
  33. package/dist/better-auth/index.js +13 -7
  34. package/dist/better-supabase/index.d.ts +392 -220
  35. package/dist/better-supabase/index.js +293 -152
  36. package/dist/{bind-DOyrv6zi.d.ts → bind-Cp2hBHzP.d.ts} +27 -12
  37. package/dist/{bind-CAvgUuKs.js → bind-D_sZSVA3.js} +22 -10
  38. package/dist/{body-CH5of8Ne.js → body-CJQwYVa8.js} +3 -3
  39. package/dist/{body-text-QcXok_SI.js → body-text-DQhcmqdY.js} +8 -4
  40. package/dist/{boundary-BM8a_P6E.js → boundary-BV3O1eud.js} +8 -2
  41. package/dist/{boundary-BmHxVH1J.d.ts → boundary-C9ck-3uK.d.ts} +13 -4
  42. package/dist/{budget-NbEtbJC_.js → budget-BELja5A9.js} +6 -3
  43. package/dist/{budget-JqcRqyhK.d.ts → budget-hYsPz_yE.d.ts} +6 -3
  44. package/dist/{build-instance-Bu_eDqYw.js → build-instance-CNWaYJyr.js} +3 -3
  45. package/dist/{canonical-json-BC8_nMTw.js → canonical-json-DwilZ1iB.js} +6 -3
  46. package/dist/{capability-N1K9IpqS.js → capability-BqX94r07.js} +31 -25
  47. package/dist/{capability-Drg-1YhL.d.ts → capability-ChuiONQU.d.ts} +41 -29
  48. package/dist/{casbin-Dyu2gnUD.js → casbin-H0rKxBx2.js} +16 -8
  49. package/dist/{casbin-Cr7RLtA3.js → casbin-cbSbhT_k.js} +2 -2
  50. package/dist/{casl-64gpT-8x.js → casl-C4OINZHI.js} +2 -2
  51. package/dist/{casl-DjEDhTCP.js → casl-CHHoCldP.js} +19 -10
  52. package/dist/catalog/index.d.ts +104 -23
  53. package/dist/catalog/index.js +117 -8
  54. package/dist/{catalog-HD2gf5mY.js → catalog-BFpz2EmT.js} +57 -26
  55. package/dist/{catalog-DZVbrF-z.js → catalog-DCspHDc8.js} +3 -3
  56. package/dist/{catalog-doc-Cdn7-0pQ.js → catalog-doc-DjMKzJp9.js} +53 -16
  57. package/dist/{catalog-fingerprint-CCP0-yQS.js → catalog-fingerprint-e6aCWosn.js} +19 -15
  58. package/dist/catalog-mRQQQhNK.js +1 -0
  59. package/dist/catalog-operations-Dadrl7Z-.js +60 -0
  60. package/dist/{create-CQWIpUG-.js → challenge-DImNcR7B.js} +157 -39
  61. package/dist/chat/index.d.ts +1 -1
  62. package/dist/chat/index.js +13 -10
  63. package/dist/chat-sdk/index.d.ts +44 -26
  64. package/dist/chat-sdk/index.js +17 -17
  65. package/dist/checks-CGkP3Z7A.js +40 -0
  66. package/dist/{claims-map-7oQ3ue4X.js → claims-map-CKkoAAYF.js} +5 -2
  67. package/dist/{claims-map-Ca-QX8C6.d.ts → claims-map-D1Pb5oRq.d.ts} +8 -5
  68. package/dist/claude-agent/index.d.ts +6 -6
  69. package/dist/claude-agent/index.js +6 -3
  70. package/dist/clerk/index.d.ts +11 -7
  71. package/dist/clerk/index.js +6 -6
  72. package/dist/cli/bin.js +4 -4
  73. package/dist/cli/index.d.ts +82 -7
  74. package/dist/cli/index.js +6 -6
  75. package/dist/{clients-C7zLFuWT.d.ts → clients-C_NOET3z.d.ts} +5 -5
  76. package/dist/{clients-DjU5ABMy.js → clients-DYr3U86j.js} +3 -3
  77. package/dist/cloud/index.d.ts +186 -38
  78. package/dist/cloud/index.js +293 -31
  79. package/dist/{cloud-ytQ3uviA.js → cloud-BFlGMaak.js} +5 -6
  80. package/dist/{codemod-5mpSpnUY.js → codemod-DLQ9Zpo4.js} +3 -4
  81. package/dist/{codemod-ua2hHy7w.js → codemod-DWSN2erG.js} +523 -201
  82. package/dist/collect-B5BL3klN.js +1 -0
  83. package/dist/{collect-mLTY4nwb.js → collect-B7ZFAJU3.js} +36 -64
  84. package/dist/{collect-Ci6akVwH.js → collect-Bzv3le0A.js} +6 -6
  85. package/dist/{compare-pfyVnBjE.js → compare-DTfyUunF.js} +2 -2
  86. package/dist/compile/index.d.ts +2 -2
  87. package/dist/compile/index.js +1 -1
  88. package/dist/{compile-1bsAezL0.d.ts → compile-BFzysW3o.d.ts} +36 -12
  89. package/dist/{compile-CMqMx_IN.js → compile-EzEMB-7v.js} +77 -33
  90. package/dist/{completion-BTFrHZhX.js → completion-saoYiRFO.js} +17 -8
  91. package/dist/config-BwPBfN0t.js +108 -0
  92. package/dist/{config-Bj2Ixq3d.js → config-DBeXXmBF.js} +2 -2
  93. package/dist/{config-report-DSpsLpCE.js → config-report-BipSWA6V.js} +9 -6
  94. package/dist/config-shape-ykV0Vm2n.js +134 -0
  95. package/dist/{connection-DjhIJSs2.js → connection-B72dg5Q2.js} +23 -22
  96. package/dist/connector-schema-CYLQNMYq.js +434 -0
  97. package/dist/{context-B_u3_bDJ.js → context-BnIzxTNE.js} +4 -3
  98. package/dist/convex/index.d.ts +13 -7
  99. package/dist/convex/index.js +9 -6
  100. package/dist/core-H-mbhpZc.js +341 -0
  101. package/dist/core-hWIARPDz.d.ts +206 -0
  102. package/dist/{create-CBMmFie-.d.ts → create-BSNrVuxh.d.ts} +87 -34
  103. package/dist/{create-B30OMUOJ.d.ts → create-BVq1lNQE.d.ts} +49 -28
  104. package/dist/{create-D_NmPOdH.d.ts → create-CM1FciYG.d.ts} +37 -29
  105. package/dist/{create-CGm28gyI.js → create-Cq4Uox0f.js} +13 -9
  106. package/dist/{create-DCF2SvoT.js → create-_noSrY1T.js} +15 -21
  107. package/dist/{credential-BcoiejpY.js → credential-CyyyvCsL.js} +42 -39
  108. package/dist/{credentials-DPyHmYz5.js → credentials-CdDxp7jN.js} +6 -6
  109. package/dist/{deciding-columns-Sq12mEA6.js → deciding-columns-NB4wcyBf.js} +13 -2
  110. package/dist/{delegation-j6-rc37o.js → delegation-CDB6_keF.js} +31 -22
  111. package/dist/delivery/index.d.ts +5 -5
  112. package/dist/delivery/index.js +6 -5
  113. package/dist/{delivery-DCAgNyCn.js → delivery-BupfvJIV.js} +81 -20
  114. package/dist/{delivery-event-xX4obB8F.js → delivery-event-JioK5YbS.js} +6 -6
  115. package/dist/denied-text-CHNlVInN.d.ts +22 -0
  116. package/dist/{describe-BybMRY7A.js → describe-Bb4hGK5d.js} +6 -5
  117. package/dist/{describe-B5qgDvEW.d.ts → describe-ByS9LgHK.d.ts} +5 -5
  118. package/dist/{device-BARQ8eYG.js → device-BwbJNmb2.js} +11 -8
  119. package/dist/{diff-CmuSD3vc.js → diff-CN8IYhC_.js} +2 -2
  120. package/dist/{diff-3jbx6Rm4.js → diff-iZWV65nC.js} +23 -14
  121. package/dist/{digest-B3kc_PgQ.d.ts → digest-8Yx2CchM.d.ts} +3 -3
  122. package/dist/{doctor-BdZw53-k.js → doctor-CHD1M9R5.js} +485 -141
  123. package/dist/{doctor-3ZqNHX_G.js → doctor-D3wo-yuz.js} +4 -4
  124. package/dist/drizzle/index.d.ts +33 -19
  125. package/dist/drizzle/index.js +17 -9
  126. package/dist/elysia/index.d.ts +17 -11
  127. package/dist/elysia/index.js +5 -5
  128. package/dist/{errors-BKy0EfhN.js → errors-B6R_lg2a.js} +13 -4
  129. package/dist/{errors-BWXBMaKK.d.ts → errors-CHwoRRpB.d.ts} +4 -1
  130. package/dist/{errors-CWTY6uih.js → errors-Vpu6rKHl.js} +14 -10
  131. package/dist/{errors-DH5QEGXh.d.ts → errors-zi_4T-rx.d.ts} +22 -6
  132. package/dist/{evaluate-CNClBvcj.js → evaluate-Dd8Ta0Ie.js} +185 -80
  133. package/dist/{evaluations-beAooV0n.js → evaluations-IBceAeKT.js} +41 -20
  134. package/dist/{evaluations-C_1vdSZc.d.ts → evaluations-z8dQFDaN.d.ts} +12 -6
  135. package/dist/eve/index.d.ts +9 -6
  136. package/dist/eve/index.js +4 -4
  137. package/dist/{event-time-CsegxXxB.js → event-time-BGy48400.js} +8 -4
  138. package/dist/{expiry-D4_YKRKD.js → expiry-6XByK0dm.js} +8 -5
  139. package/dist/express/index.d.ts +9 -6
  140. package/dist/express/index.js +9 -6
  141. package/dist/fastify/index.d.ts +16 -10
  142. package/dist/fastify/index.js +8 -5
  143. package/dist/{fetch-adapter-Dw0MTS3D.d.ts → fetch-adapter-C1DCvpqV.d.ts} +9 -6
  144. package/dist/{fetch-adapter-DD_gfmrC.js → fetch-adapter-JL43jD3E.js} +14 -11
  145. package/dist/fields-D0vUI6dq.js +498 -0
  146. package/dist/{files-C5ZI27eV.js → files-B3AA05f1.js} +21 -5
  147. package/dist/{files-D_JIzUrP.js → files-BSjrtIHw.js} +11 -4
  148. package/dist/{fixtures-B7XrLeY7.js → fixtures-A1_sp_tR.js} +15 -6
  149. package/dist/{flags-C3DktBDY.js → flags-DXjoTVbS.js} +2 -2
  150. package/dist/{freeze-CrU8nQeX.js → freeze-jjan0lCv.js} +4 -1
  151. package/dist/{from-snapshot-CTCMsFZk.js → from-snapshot-DCakWRsr.js} +26 -16
  152. package/dist/gen-B5kvbAoZ.js +58 -0
  153. package/dist/gen-DWCYcMQM.js +827 -0
  154. package/dist/generate-CRVV5V7l.js +165 -0
  155. package/dist/generate-CezbCaTI.js +275 -0
  156. package/dist/{grantee-hxrUsbpM.js → grantee-Dke-9rd1.js} +4 -4
  157. package/dist/{grantee-conditions-CcXf8hMM.js → grantee-conditions-BrYPe-w0.js} +12 -12
  158. package/dist/{grantee-match-DbENBHLB.js → grantee-match-7RZZvoT_.js} +12 -6
  159. package/dist/{graph-sql-B-dsAT6j.d.ts → graph-sql-BwFC4Qjs.d.ts} +3 -3
  160. package/dist/h3/index.d.ts +10 -7
  161. package/dist/h3/index.js +3 -3
  162. package/dist/headers-B9jQxjtW.d.ts +10 -0
  163. package/dist/{helpers-CBYVMjwh.js → helpers-DJicaG6f.js} +40 -28
  164. package/dist/hono/index.d.ts +16 -10
  165. package/dist/hono/index.js +5 -5
  166. package/dist/{hosted-BPk51-kX.d.ts → hosted-Cmtxogd0.d.ts} +44 -20
  167. package/dist/{hosted-B46-5LYE.js → hosted-D0IzESu_.js} +68 -25
  168. package/dist/{http-ujKm0JXE.js → http-DH94eh6f.js} +4 -4
  169. package/dist/{http-BBoKefeS.js → http-DKLXrFGk.js} +13 -7
  170. package/dist/{http-DXJ37RDA.js → http-DOL33cO0.js} +11 -8
  171. package/dist/{import-wyqXUyjm.js → import-CST57XLp.js} +64 -51
  172. package/dist/{import-CNV7I2Dw.js → import-_YqhhwvX.js} +6 -6
  173. package/dist/{index-B8YjkEZ4.d.ts → index-B8s204GL.d.ts} +64 -52
  174. package/dist/{index-Ch8LpNDp.d.ts → index-BT5-1VsX.d.ts} +64 -25
  175. package/dist/{index-DuWxc5dt.d.ts → index-BW_0MZOS.d.ts} +388 -149
  176. package/dist/index-BhxEUY9J.d.ts +233 -0
  177. package/dist/index-Bv5iXPqU.d.ts +210 -0
  178. package/dist/{index-C-6Letxg.d.ts → index-_9UiQIkt.d.ts} +164 -77
  179. package/dist/index.d.ts +22 -21
  180. package/dist/index.js +35 -33
  181. package/dist/{init-GG6Jh8HD.js → init-Dz_PsHdv.js} +5 -5
  182. package/dist/{init-DeMYsnYJ.js → init-cE3A8aXq.js} +10 -10
  183. package/dist/{instance-options-BsVpyGIk.d.ts → instance-options-B0KXqTrJ.d.ts} +4 -4
  184. package/dist/{instance-snapshot-BOEhcqIF.js → instance-snapshot--JWiTrvO.js} +81 -56
  185. package/dist/{instant-BluqDvyS.js → instant-DK3Iz83e.js} +2 -2
  186. package/dist/{internals-Dk8A8fX3.js → internals-B3IgHrvo.js} +6 -3
  187. package/dist/{json-schema-B-vAwlde.js → json-schema-BPGa-RjQ.js} +9 -3
  188. package/dist/{json-schema-CN_iLFH2.d.ts → json-schema-BfXgnRNT.d.ts} +4 -4
  189. package/dist/jwt/index.d.ts +125 -17
  190. package/dist/jwt/index.js +157 -16
  191. package/dist/{kernel-D0NVb1cK.js → kernel-C-fYydV2.js} +151 -16
  192. package/dist/kysely/index.d.ts +49 -33
  193. package/dist/kysely/index.js +9 -7
  194. package/dist/{live-options-BaAFCIiu.js → live-options-BBIT68le.js} +2 -2
  195. package/dist/{load-DFS_ry0W.js → load-DjSU5KXO.js} +6 -6
  196. package/dist/load-Dm0pSYH3.js +1 -0
  197. package/dist/{login-Dfe5RlYk.js → login-D-8tMqzo.js} +4 -4
  198. package/dist/{login-imhuwvn3.js → login-DplQ0s84.js} +18 -15
  199. package/dist/{manifest-dvL2XEe1.js → manifest-Cgiq5oqc.js} +67 -37
  200. package/dist/{manifest-mx5ghSFM.d.ts → manifest-CzzWtnAb.d.ts} +144 -28
  201. package/dist/{manifest-schema-C0kK_8V0.js → manifest-schema-2r37XRhD.js} +80 -9
  202. package/dist/{manifest-C8IzW3Do.js → manifest-wg8WkkpD.js} +11 -7
  203. package/dist/{map-claims-D3oRmTk0.js → map-claims-BNWCJtmP.js} +27 -18
  204. package/dist/{map-error-Dr70oA_3.js → map-error-pasIGqMT.js} +7 -7
  205. package/dist/{markers-C6joDI3o.js → markers-BeHZ4x9Q.js} +20 -5
  206. package/dist/mcp/index.d.ts +154 -47
  207. package/dist/mcp/index.js +200 -41
  208. package/dist/{migrate-CIq4-E9F.js → migrate-B7oP_sQU.js} +102 -31
  209. package/dist/module-values-BJTBdo6y.js +107 -0
  210. package/dist/nest/index.d.ts +23 -13
  211. package/dist/nest/index.js +18 -11
  212. package/dist/next/client.d.ts +5 -2
  213. package/dist/next/client.js +1 -1
  214. package/dist/next/index.d.ts +72 -26
  215. package/dist/next/index.js +110 -6
  216. package/dist/next/plugin.d.ts +1 -1
  217. package/dist/next/plugin.js +4 -3
  218. package/dist/node/index.d.ts +5 -5
  219. package/dist/node/index.js +3 -3
  220. package/dist/{ocsf-BFp-PZZA.js → ocsf-TcjRBgIs.js} +15 -5
  221. package/dist/openai/index.d.ts +13 -7
  222. package/dist/openai/index.js +3 -3
  223. package/dist/openapi/index.d.ts +61 -30
  224. package/dist/openapi/index.js +2 -2
  225. package/dist/{openapi-B7HZ0f-r.js → openapi-BOsx0xn9.js} +34 -24
  226. package/dist/{openapi-C4dDTVEd.js → openapi-CBZUhA3l.js} +4 -5
  227. package/dist/{openapi-DD1SV-5-.js → openapi-VeHHU2l9.js} +23 -14
  228. package/dist/{operation-findings-DgATDpvh.js → operation-findings-CXtFzlKJ.js} +3 -3
  229. package/dist/{operations-X0VM7F3m.d.ts → operations-Ci_rT6Uo.d.ts} +10 -7
  230. package/dist/orpc/index.d.ts +68 -14
  231. package/dist/orpc/index.js +62 -13
  232. package/dist/otel/index.d.ts +7 -4
  233. package/dist/otel/index.js +8 -5
  234. package/dist/output-files-BHOIlrfD.js +1 -0
  235. package/dist/{output-files-DhRBBE4n.js → output-files-BIQ_9pIs.js} +29 -17
  236. package/dist/{output-1im__-08.js → output-tkju6U7R.js} +15 -7
  237. package/dist/ownership-B4L59T9u.js +1054 -0
  238. package/dist/parse-1_ZheTW5.js +151 -0
  239. package/dist/parse-local-manifest-BQhTlLQS.d.ts +10 -0
  240. package/dist/parse-local-manifest-DEiCF4ah.js +69 -0
  241. package/dist/{parse-request-D_tUXG6M.js → parse-request-CwCZpyjV.js} +7 -8
  242. package/dist/{paths-DXSHAMIa.js → paths-CUvURzHp.js} +4 -1
  243. package/dist/pdp/index.d.ts +9 -6
  244. package/dist/pdp/index.js +23 -12
  245. package/dist/{peer-CRvC7Hg1.js → peer-C9LvBCcb.js} +1 -1
  246. package/dist/peer-Q0fuZ6hx.js +982 -0
  247. package/dist/{permdock-SV8ZINYT.d.ts → permdock-B6Sf4T_S.d.ts} +270 -117
  248. package/dist/{permdock-BrAscV28.js → permdock-L-_I_3zP.js} +226 -74
  249. package/dist/{permission-registry-Br4jSNVi.js → permission-registry-B8tYxPIt.js} +24 -11
  250. package/dist/{vocabulary-CN8H_9UF.d.ts → permission-types-CAY-GU7e.d.ts} +130 -104
  251. package/dist/{permissions-u_KHg-sN.d.ts → permissions-Bx6UI8n1.d.ts} +6 -2
  252. package/dist/{permissions-B-wCP5ZC.js → permissions-CVXmRILq.js} +3 -3
  253. package/dist/{permissions-BPxlwVhN.js → permissions-mDcTWoBs.js} +8 -5
  254. package/dist/pg-DQTqRrou.js +60 -0
  255. package/dist/{pins-8ILTftC9.js → pins-nqarl3oE.js} +4 -1
  256. package/dist/pkce-CnmmYqUZ.js +21 -0
  257. package/dist/{policy-77FSAq_V.d.ts → policy-Ba4bDhaj.d.ts} +5 -5
  258. package/dist/{policy-DbM5YYtV.js → policy-CLQ8__GF.js} +49 -20
  259. package/dist/{policy-from-catalog-C2gMa2Dj.js → policy-from-catalog-CJgOm6aq.js} +28 -25
  260. package/dist/{policy-module-CTlwMvLI.js → policy-module-xym9fnSq.js} +12 -6
  261. package/dist/{policy-types-n0uRTsW8.d.ts → policy-types-CCiDRZBH.d.ts} +802 -334
  262. package/dist/postgres-store-DcyrPS-r.js +1028 -0
  263. package/dist/{postgrest-DAjUkF9w.js → postgrest-D4nuPXIQ.js} +88 -36
  264. package/dist/{postgrest-CEgRbefE.d.ts → postgrest-DicQyqm-.d.ts} +60 -30
  265. package/dist/powersync-DHNQX06W.js +1117 -0
  266. package/dist/{powersync-DISt6SUe.js → powersync-DXqGuq9A.js} +3 -3
  267. package/dist/powersync-Djf-zCpB.js +1 -0
  268. package/dist/preset/index.d.ts +38 -28
  269. package/dist/preset/index.js +1 -1
  270. package/dist/{preset-DZdU0tne.js → preset-BjLzeFpp.js} +58 -34
  271. package/dist/{principal-source-pHneukrx.js → principal-source-C6N60GtM.js} +10 -10
  272. package/dist/prisma/index.d.ts +69 -41
  273. package/dist/prisma/index.js +21 -17
  274. package/dist/{problem-CTviyH5L.js → problem-BVLHFK33.js} +41 -21
  275. package/dist/{problem-details-cn5X30gZ.js → problem-details-CLDgX1KV.js} +13 -4
  276. package/dist/{problem-types-CJ2325SZ.js → problem-types-DSsRfONQ.js} +4 -1
  277. package/dist/prompt-BYc6drYW.js +938 -0
  278. package/dist/protected-action-BE7N_Luo.d.ts +58 -0
  279. package/dist/protected-action-DUYqb-Ma.js +80 -0
  280. package/dist/{protected-BlF0F6wL.js → protected-action-QEA8arRB.js} +48 -14
  281. package/dist/{provider-B1al-AZz.js → provider-C55OGXJ7.js} +5 -4
  282. package/dist/{provider-DILL9oPK.d.ts → provider-DXfq5c2d.d.ts} +1 -1
  283. package/dist/{provider-store-DM6DNcta.js → provider-store-CaTv00tr.js} +13 -9
  284. package/dist/pull-B65ndFNZ.js +1 -0
  285. package/dist/{pull-jEwbf80J.js → pull-CwpGaQSi.js} +12 -11
  286. package/dist/{push-BD4f15co.js → push-DgssgzkK.js} +62 -16
  287. package/dist/{pushed-policy-DCW91KQU.d.ts → pushed-policy-D1Eoi6NM.d.ts} +12 -6
  288. package/dist/{pushed-policy-CqtxkV4G.js → pushed-policy-ITwYKvvH.js} +10 -7
  289. package/dist/react/index.d.ts +9 -8
  290. package/dist/react/index.js +7 -6
  291. package/dist/react/provider-client.d.ts +1 -1
  292. package/dist/react/provider-client.js +1 -1
  293. package/dist/react-native/index.d.ts +104 -51
  294. package/dist/react-native/index.js +394 -67
  295. package/dist/{refs-K6eWUJ0H.js → refs-C8BKxc_e.js} +17 -3
  296. package/dist/{relation-walk-3OyDBF0S.js → relation-walk-DK_gkgL7.js} +12 -9
  297. package/dist/{relations-BnCWnJGI.js → relations-BxvRvDHK.js} +3 -3
  298. package/dist/{replay-Du1tJjG7.js → replay-BU09ad4L.js} +1 -1
  299. package/dist/{replay-Bkm-Ne4l.d.ts → replay-DNftIb_R.d.ts} +1 -1
  300. package/dist/{request-context-C81Pip9n.js → request-context-C25ilqiJ.js} +8 -8
  301. package/dist/{request-schema-CMreVuFM.js → request-schema-DhX7UbfQ.js} +4 -1
  302. package/dist/resend/index.d.ts +34 -28
  303. package/dist/resend/index.js +29 -29
  304. package/dist/resolve-names-CF7xXLSG.js +201 -0
  305. package/dist/{resource-relations-D_jw0BFx.js → resource-relations-8-pCScBO.js} +18 -9
  306. package/dist/{retire-CALjIQ7e.js → retire-B2xffQgY.js} +15 -6
  307. package/dist/{revocations-R07lFBnX.d.ts → revocations-BaUXHM1N.d.ts} +6 -3
  308. package/dist/{rls-DTvYd-lI.js → rls-CNEH2_BG.js} +743 -624
  309. package/dist/{rls-BAqP4q66.js → rls-Ca8Jz9b5.js} +41 -10
  310. package/dist/{role-builder-uWQZ4v84.js → role-builder-BK2-T6oD.js} +41 -20
  311. package/dist/rolldown-runtime-C3I60J0A.js +4 -0
  312. package/dist/{row-conditions-h2HythXQ.js → row-conditions-BAGHOmVq.js} +4 -3
  313. package/dist/{rpc-VSl5ylaQ.js → rpc-fNqAIqQk.js} +8 -5
  314. package/dist/{run-CUKuz0A8.js → run-Bz26OTfO.js} +26 -23
  315. package/dist/run-D-JE8QWb.js +1 -0
  316. package/dist/{run-ticket-DocwaTKn.d.ts → run-ticket-DbWI9f99.d.ts} +33 -13
  317. package/dist/{run-ticket-sxFI6LAk.js → run-ticket-Dv7aF7Dk.js} +29 -8
  318. package/dist/{runtime-D3VTAiCA.js → runtime-BGnrOkVH.js} +5 -2
  319. package/dist/{saas-BCXRuXca.js → saas-iWnUdwCt.js} +42 -29
  320. package/dist/{scan-qvOe0hS3.js → scan-DCj1KQfn.js} +1 -1
  321. package/dist/{schema-B4v0Qrac.js → schema-BOJjqlWL.js} +3 -2
  322. package/dist/{schema-yLuBWWsh.js → schema-Dst9I9Gs.js} +9 -5
  323. package/dist/scim/index.d.ts +3 -2
  324. package/dist/scim/index.js +3 -1
  325. package/dist/scim-D8YupzX1.js +44 -0
  326. package/dist/{scim-ClHtpyV3.js → scim-jJBJ7g1Z.js} +35 -551
  327. package/dist/{scopes-CUPSjo9q.js → scopes-0Up_UA2t.js} +42 -24
  328. package/dist/server/index.d.ts +12 -12
  329. package/dist/server/index.js +13 -13
  330. package/dist/{server-C3WXAHZj.js → server-3cVlTLde.js} +31 -31
  331. package/dist/{server-types-CKQiCnON.d.ts → server-types-CIlpSA2G.d.ts} +81 -46
  332. package/dist/{sha256-D9ihqmvd.js → sha256-C-4WXKIu.js} +4 -3
  333. package/dist/{shared-BAK8t4Uo.js → shared-Afctg7B0.js} +100 -61
  334. package/dist/{shared-DvvFzYXe.js → shared-l0oGGetg.js} +9 -6
  335. package/dist/{signals-D3NcTKUS.js → signals-B1vHR3fN.js} +2 -2
  336. package/dist/{sink-BEZSlMS_.js → sink-D9_vh372.js} +32 -21
  337. package/dist/{sink-4-eQIRWf.d.ts → sink-Dvi7YZG_.d.ts} +44 -20
  338. package/dist/{skills-B6lVdD_W.js → skills-Bjj7BNEQ.js} +16 -12
  339. package/dist/{skills-CTYwkl44.js → skills-OuoMR49L.js} +3 -3
  340. package/dist/{snapshot-B7DkYg6g.js → snapshot-CXlzi69u.js} +21 -18
  341. package/dist/{snapshot-cache-PXI-vGpY.d.ts → snapshot-cache-BAXZ0KOp.d.ts} +21 -12
  342. package/dist/{snapshot-cache-DZHQ0KF6.js → snapshot-cache-Bx_4xC_6.js} +14 -11
  343. package/dist/solid/index.d.ts +55 -15
  344. package/dist/solid/index.js +46 -12
  345. package/dist/solid-start/index.d.ts +30 -12
  346. package/dist/solid-start/index.js +3 -3
  347. package/dist/sources-B1Os_YUu.d.ts +312 -0
  348. package/dist/{sources-vs5dGOsS.js → sources-CMAM-2A3.js} +156 -51
  349. package/dist/sources-qoIJQrJv.js +11 -0
  350. package/dist/{sql-B5T1IL83.js → sql-0WjxIp9g.js} +32 -7
  351. package/dist/sql-B80DFdpG.d.ts +10 -0
  352. package/dist/{src-Cu2m75uo.js → src-DZ0l9UAg.js} +305 -123
  353. package/dist/ssf/index.d.ts +4 -4
  354. package/dist/ssf/index.js +665 -224
  355. package/dist/{standard-webhooks-rbD7LS6h.d.ts → standard-webhooks-C-qX4mJW.d.ts} +7 -7
  356. package/dist/{standard-webhooks-DgFFD-Ga.js → standard-webhooks-D67a3nzk.js} +5 -5
  357. package/dist/{store-BDutJkDL.js → store-RNFvaJJv.js} +43 -29
  358. package/dist/{store-options-u0ycEe8s.js → store-options-Dil3lraY.js} +105 -15
  359. package/dist/stores-C0Kta5Ft.d.ts +59 -0
  360. package/dist/{stores-CGhM8BN_.js → stores-DxZWDXCs.js} +42 -5
  361. package/dist/{stream-CvdUS9V1.js → stream-CDvF0sJm.js} +5 -5
  362. package/dist/{stream-CeCMJmBB.d.ts → stream-ltuLdtTG.d.ts} +4 -3
  363. package/dist/{style-DiKWnAvn.js → style-DblOtSga.js} +1 -1
  364. package/dist/{style-Uao76wO7.js → style-Ds11Hmk4.js} +3 -1
  365. package/dist/{subject-settings-CkEwrw3W.js → subject-settings-8sH5HlII.js} +8 -4
  366. package/dist/{row-check-Dt35czLy.d.ts → subject-settings-vNW8qmUH.d.ts} +30 -18
  367. package/dist/supabase/index.d.ts +48 -37
  368. package/dist/supabase/index.js +6 -6
  369. package/dist/supabase/middleware.d.ts +19 -13
  370. package/dist/supabase/middleware.js +7 -7
  371. package/dist/{supabase-x5JtR2tc.js → supabase-BL1qJzzY.js} +82 -36
  372. package/dist/{supabase-By_frk3U.js → supabase-D39cuGPt.js} +3 -3
  373. package/dist/{supabase-hook-BMoEhZir.js → supabase-hook-B-yXnzUl.js} +1206 -286
  374. package/dist/supabase-hook-H-MtE9Wd.js +1 -0
  375. package/dist/supautils-BU-pAEpf.js +808 -0
  376. package/dist/{support-session-C6xJQYut.js → support-session-BsmPCbz8.js} +22 -22
  377. package/dist/svelte/PermissionBoundary.svelte +2 -6
  378. package/dist/svelte/Protected.svelte +2 -8
  379. package/dist/svelte/index.d.ts +9 -8
  380. package/dist/svelte/index.js +10 -9
  381. package/dist/svelte/runtime.d.ts +4 -4
  382. package/dist/svelte/runtime.js +4 -4
  383. package/dist/svelte/source.d.ts +9 -8
  384. package/dist/svelte/source.js +6 -5
  385. package/dist/sveltekit/index.d.ts +30 -12
  386. package/dist/sveltekit/index.js +2 -2
  387. package/dist/{ownership-DqaJNJPn.js → tables-DeMNEy6V.js} +1025 -1085
  388. package/dist/tanstack-start/index.d.ts +22 -10
  389. package/dist/tanstack-start/index.js +2 -2
  390. package/dist/{target-Bw37TFNA.js → target-qdEAnnhU.js} +6 -6
  391. package/dist/{tenancy-DN2QAx9z.js → tenancy-5d1zVBvK.js} +36 -21
  392. package/dist/terminal/index.d.ts +23 -14
  393. package/dist/terminal/index.js +17 -20
  394. package/dist/testing/core.d.ts +2 -0
  395. package/dist/testing/core.js +1 -0
  396. package/dist/testing/fixtures/index.d.ts +15 -0
  397. package/dist/testing/fixtures/index.js +831 -0
  398. package/dist/testing/index.d.ts +235 -285
  399. package/dist/testing/index.js +502 -927
  400. package/dist/testing/saas/index.d.ts +43 -27
  401. package/dist/testing/saas/index.js +2 -2
  402. package/dist/testing/saas/permissions.d.ts +1 -1
  403. package/dist/testing/saas/permissions.js +1 -1
  404. package/dist/text-diff-BtfSmdUo.js +444 -0
  405. package/dist/{thenable-yD7SabqG.js → thenable-BNSM1U2R.js} +12 -3
  406. package/dist/{time-DkWjdL98.js → time-nR1JesoH.js} +32 -8
  407. package/dist/{token-BLZcjQgt.js → token-DC9EQiet.js} +15 -13
  408. package/dist/{tool-refusal-CMLN5xhn.js → tool-refusal-Qpjs_W6M.js} +5 -2
  409. package/dist/trpc/index.d.ts +11 -8
  410. package/dist/trpc/index.js +15 -9
  411. package/dist/type-helpers-BIPIDa6a.d.ts +50 -0
  412. package/dist/{types-8RnwUAvE.d.ts → types-AMJ5qoU_.d.ts} +49 -30
  413. package/dist/{types-C_IiEs64.d.ts → types-B2mlGuhW.d.ts} +14 -11
  414. package/dist/{types-_WhUP7ud.d.ts → types-B4uqKDnp.d.ts} +25 -12
  415. package/dist/{types-CX7AvRqP.d.ts → types-BJk0BKRX.d.ts} +24 -14
  416. package/dist/types-B_d_g7T3.d.ts +262 -0
  417. package/dist/{types-BdtSDbBO.d.ts → types-B_tiYvk8.d.ts} +59 -32
  418. package/dist/{types-DqzsnlSA.js → types-CcUXciSj.js} +17 -5
  419. package/dist/{types-Dfv0aTER.d.ts → types-DC1Loeh3.d.ts} +449 -168
  420. package/dist/{types-lUlG3TVd.d.ts → types-DHKPcqzr.d.ts} +2 -2
  421. package/dist/{types-C791HFu9.d.ts → types-DjuMBNF9.d.ts} +68 -32
  422. package/dist/{types-C863OQiR.d.ts → types-HzqOtvsJ.d.ts} +23 -12
  423. package/dist/{types-Druu9wLM.d.ts → types-ZzRGoViD.d.ts} +77 -24
  424. package/dist/{types-BzzaHxt3.d.ts → types-ah9NlU6j.d.ts} +137 -48
  425. package/dist/{types-CVZSNocA.d.ts → types-djVzLlIV.d.ts} +31 -14
  426. package/dist/{types-BtHtcKMr.d.ts → types-yUuPR5Hy.d.ts} +47 -24
  427. package/dist/unplugin/index.d.ts +1 -1
  428. package/dist/unplugin/index.js +2 -2
  429. package/dist/usage-CYeXek0p.js +1 -0
  430. package/dist/{usage-SveTRTyr.js → usage-CxEzS4ey.js} +50 -26
  431. package/dist/{usage-CRVl9V3t.js → usage-ab0PdusX.js} +2 -2
  432. package/dist/{validation-error-ZfUHbKvf.js → validation-error-CYg2kJEw.js} +4 -1
  433. package/dist/{validation-error-DHUrAkku.d.ts → validation-error-YGg2mXyH.d.ts} +5 -2
  434. package/dist/{validity-CZ7-y0Cj.js → validity-Buc7w8E9.js} +13 -10
  435. package/dist/{verifier-DHuh-okk.js → verifier-DUV6pLqZ.js} +10 -4
  436. package/dist/{verify-BaAKx7t6.js → verify-DZeqoWu5.js} +417 -489
  437. package/dist/version-DMQ0dnN5.js +48 -0
  438. package/dist/version-DizhmD72.js +1 -0
  439. package/dist/{views-DTIIO-oQ.js → views-CD8wuL4Z.js} +19 -6
  440. package/dist/vocabulary-DEJ5j4mR.d.ts +70 -0
  441. package/dist/vue/index.d.ts +71 -21
  442. package/dist/vue/index.js +50 -13
  443. package/dist/{waiter-B986w1oK.d.ts → waiter-Bu9zAlE0.d.ts} +13 -10
  444. package/dist/{waiter-BGUtGYoU.js → waiter-aBLM63_f.js} +1 -1
  445. package/dist/{watch-vea54PRw.js → watch-Cx_WciLE.js} +8 -8
  446. package/dist/watch-DB42U1ib.js +1 -0
  447. package/dist/webmcp/index.d.ts +11 -11
  448. package/dist/webmcp/index.js +8 -5
  449. package/dist/{where-scope-C9vfEphl.js → where-scope-DlCdCM_8.js} +56 -30
  450. package/dist/{who-can-DWBAcaCQ.js → who-can-rI7dCR9Q.js} +23 -20
  451. package/dist/workflow/index.d.ts +3 -3
  452. package/dist/workflow/index.js +13 -13
  453. package/dist/workflow-sdk/index.d.ts +19 -13
  454. package/dist/workflow-sdk/index.js +6 -6
  455. package/dist/{wrap-gX61EtpB.js → wrap-B2wziJI_.js} +11 -5
  456. package/dist/{wrap-C5jC6sKI.d.ts → wrap-DlJE3gS_.d.ts} +8 -5
  457. package/package.json +25 -14
  458. package/schemas/catalog-v1.json +3 -0
  459. package/schemas/cli-result-v1.json +1 -0
  460. package/schemas/cloud-api-v1.json +152 -7
  461. package/schemas/connector-v1.json +8 -0
  462. package/schemas/supabase-claims-v1.json +5 -0
  463. package/schemas/supabase-manifest-v1.json +308 -75
  464. package/skills/permdock/SKILL.md +1 -0
  465. package/skills/permdock-agents/references/runtimes.md +3 -1
  466. package/skills/permdock-approvals/references/stores-and-resume.md +2 -1
  467. package/skills/permdock-credentials/references/tokens-keys-links.md +8 -6
  468. package/skills/permdock-data/references/queries-and-rls.md +6 -2
  469. package/skills/permdock-tenancy/SKILL.md +1 -1
  470. package/skills/permdock-tenancy/references/ownership-and-custom-roles.md +2 -1
  471. package/skills/permdock-wire/references/adapters.md +28 -22
  472. package/skills/permdock-wire/references/policy-options.md +1 -0
  473. package/dist/catalog-BoWglDPI.js +0 -1
  474. package/dist/collect-D7eQDffE.js +0 -1
  475. package/dist/config-bs_kZeYq.js +0 -162
  476. package/dist/denied-text-CiFQNuMV.d.ts +0 -19
  477. package/dist/fields-OYG_JR78.js +0 -203
  478. package/dist/generate-CNU1pIOo.js +0 -171
  479. package/dist/headers-BIjfMaoC.js +0 -8
  480. package/dist/headers-CIbDTUTK.d.ts +0 -7
  481. package/dist/index-Cp_ilKi1.d.ts +0 -91
  482. package/dist/index-CueFnxQc.d.ts +0 -110
  483. package/dist/load-BxEtwlBS.js +0 -1
  484. package/dist/output-files-B3IZJksC.js +0 -1
  485. package/dist/package-root-Dk_ETdkp.js +0 -31
  486. package/dist/parse-Cxq0WxrA.js +0 -53
  487. package/dist/parse-local-manifest-5ODwqu8b.d.ts +0 -10
  488. package/dist/parse-local-manifest-CVSs6J9I.js +0 -34
  489. package/dist/peer-C8swJ2GH.js +0 -50
  490. package/dist/policies-DP2nqRoF.js +0 -295
  491. package/dist/powersync-BkWWCS1K.js +0 -538
  492. package/dist/powersync-MMJ2mI2q.js +0 -1
  493. package/dist/problem-details-B45V5d2b.d.ts +0 -7
  494. package/dist/prompt-DfZLJLIn.js +0 -32
  495. package/dist/protected-RFGpakN9.d.ts +0 -38
  496. package/dist/pull-CvpINcMK.js +0 -1
  497. package/dist/run-DDwUaJDU.js +0 -1
  498. package/dist/sources-Xc4zkszI.d.ts +0 -190
  499. package/dist/stores-BUGNbJTt.d.ts +0 -30
  500. package/dist/supabase-hook-CCw5m35C.js +0 -1
  501. package/dist/supautils-B6HYL9eL.js +0 -91
  502. package/dist/text-diff-BQcUapOb.js +0 -15
  503. package/dist/types-B3_ooZgZ.d.ts +0 -172
  504. package/dist/usage-CZpSQP6L.js +0 -1
  505. package/dist/version-CEbQ5UeM.js +0 -18
  506. package/dist/version-DXkYUISx.js +0 -1
  507. package/dist/watch--ovlPOc0.js +0 -1
@@ -0,0 +1,341 @@
1
+ import { A as memoryCustomRoleSource } from "./src-DZ0l9UAg.js";
2
+ import { c as listPermissions } from "./permission-registry-B8tYxPIt.js";
3
+ import { f as scopeList } from "./scopes-0Up_UA2t.js";
4
+ import { y as membershipsClaim } from "./evaluate-Dd8Ta0Ie.js";
5
+ import { n as parseSnapshot } from "./snapshot-CXlzi69u.js";
6
+ import { n as fromSnapshot } from "./from-snapshot-DCakWRsr.js";
7
+ import { t as getPermDock } from "./permdock-L-_I_3zP.js";
8
+ import { c as quoteSqlTable, n as defaultSqlCommand, o as quoteSqlIdent, t as SQL_IDENT } from "./sql-0WjxIp9g.js";
9
+ import "./budget-BELja5A9.js";
10
+ //#region src/testing/policy-matrix.ts
11
+ function isOutcomeCell(value) {
12
+ return value === "granted" || value === "denied" || value === "approval-required" || value !== null && typeof value === "object" && ("denials" in value || "outcome" in value || "alternatives" in value || "obligations" in value || "deniedBy" in value);
13
+ }
14
+ function expectedOutcome(cell) {
15
+ return typeof cell === "string" ? cell : cell.outcome ?? "denied";
16
+ }
17
+ function same(left, right) {
18
+ return left.length === right.length && left.every((value, index) => value === right[index]);
19
+ }
20
+ function list(values) {
21
+ return `[${values.join(", ")}]`;
22
+ }
23
+ function decisionFailures(decision, cell) {
24
+ const expected = expectedOutcome(cell);
25
+ if (decision.outcome !== expected) return [`expected ${expected}, got ${decision.outcome}`];
26
+ if (typeof cell !== "object") return [];
27
+ const failures = [];
28
+ if (cell.denials !== void 0 && decision.outcome === "denied") {
29
+ for (const denial of cell.denials) if (!decision.denials.some((item) => item.reason === denial.reason && (denial.role === void 0 || item.role === denial.role))) failures.push(`no denial ${denial.reason}${denial.role === void 0 ? "" : ` for role ${String(denial.role)}`}; got ${list(decision.denials.map((item) => `${item.reason}${item.role === null ? "" : `@${item.role}`}`))}`);
30
+ }
31
+ if (cell.alternatives !== void 0 && decision.outcome === "denied") {
32
+ const actual = decision.alternatives.map((leaf) => leaf.key);
33
+ if (!same(actual, cell.alternatives)) failures.push(`alternatives: expected ${list(cell.alternatives)}, got ${list(actual)}`);
34
+ }
35
+ if (cell.obligations !== void 0 && decision.outcome === "granted") {
36
+ const actual = (decision.obligations ?? []).map((item) => item.kind);
37
+ if (!same(actual, cell.obligations)) failures.push(`obligations: expected ${list(cell.obligations)}, got ${list(actual)}`);
38
+ }
39
+ return failures;
40
+ }
41
+ /**
42
+ * `deniedBy`, against the trace of a fresh `explain` call for the same
43
+ * arguments.
44
+ */
45
+ function deniedByFailures(instance, permission, data, cell) {
46
+ if (typeof cell !== "object" || cell.deniedBy === void 0) return [];
47
+ const explained = instance.explain(permission, data);
48
+ const winner = explained.trace.denies[0]?.name;
49
+ if (explained.outcome !== "denied" || winner !== cell.deniedBy) return [`deniedBy: expected ${cell.deniedBy}, explain answered ${explained.outcome}${winner === void 0 ? "" : ` by ${winner}`}`];
50
+ return [];
51
+ }
52
+ function snapshotFailures(instance, permission, data, cell) {
53
+ const outcome = expectedOutcome(cell);
54
+ if (outcome === "approval-required") return [];
55
+ return fromSnapshot(JSON.parse(JSON.stringify(instance.snapshot()))).can(permission, data) === (outcome === "granted") ? [] : ["snapshot client disagrees with the server"];
56
+ }
57
+ /** The cells `config.matrix` names, in matrix order, before any decision. */
58
+ function pendingCells(policy, config) {
59
+ const cells = [];
60
+ for (const permission of listPermissions(policy.permissions)) {
61
+ const spec = config.matrix[permission.key];
62
+ if (spec === void 0) continue;
63
+ if (!Object.values(spec).some((value) => !isOutcomeCell(value))) {
64
+ const data = permission.kind === "instance" ? Object.values(config.fixtures ?? {})[0] : void 0;
65
+ for (const [subject, cell] of Object.entries(spec)) cells.push({
66
+ name: `${permission.key} / ${subject}`,
67
+ permission,
68
+ subject,
69
+ data,
70
+ expected: cell
71
+ });
72
+ continue;
73
+ }
74
+ for (const [fixture, row] of Object.entries(spec)) {
75
+ if (isOutcomeCell(row)) continue;
76
+ for (const [subject, cell] of Object.entries(row)) cells.push({
77
+ name: `${permission.key} / ${fixture} / ${subject}`,
78
+ permission,
79
+ subject,
80
+ fixture,
81
+ data: config.fixtures?.[fixture],
82
+ expected: cell
83
+ });
84
+ }
85
+ }
86
+ return cells;
87
+ }
88
+ /**
89
+ * Where each cell sits, without deciding it: a test runner registers one test
90
+ * per cell.
91
+ */
92
+ function policyMatrixLayout(policy, config) {
93
+ return pendingCells(policy, config).map((cell) => cell.fixture === void 0 ? {
94
+ name: cell.name,
95
+ permission: cell.permission.key,
96
+ subject: cell.subject
97
+ } : {
98
+ name: cell.name,
99
+ permission: cell.permission.key,
100
+ subject: cell.subject,
101
+ fixture: cell.fixture
102
+ });
103
+ }
104
+ /**
105
+ * Decides every cell of a policy matrix with no test runner: each cell lists
106
+ * its `failures`, and `missing` names the permissions an exhaustive matrix
107
+ * leaves out. `describePolicy` asserts the same report under Vitest.
108
+ */
109
+ async function policyMatrix(policy, config) {
110
+ const instances = /* @__PURE__ */ new Map();
111
+ for (const [name, user] of Object.entries(config.subjects)) instances.set(name, await getPermDock(policy, user, config.options));
112
+ const cells = [];
113
+ for (const pending of pendingCells(policy, config)) {
114
+ const instance = instances.get(pending.subject) ?? await getPermDock(policy, config.subjects[pending.subject], config.options);
115
+ const decision = instance.decide(pending.permission, pending.data);
116
+ const failures = [
117
+ ...decisionFailures(decision, pending.expected),
118
+ ...deniedByFailures(instance, pending.permission, pending.data, pending.expected),
119
+ ...config.snapshot === true ? snapshotFailures(instance, pending.permission, pending.data, pending.expected) : []
120
+ ];
121
+ cells.push({
122
+ name: pending.name,
123
+ permission: pending.permission.key,
124
+ subject: pending.subject,
125
+ ...pending.fixture === void 0 ? {} : { fixture: pending.fixture },
126
+ expected: pending.expected,
127
+ actual: decision.outcome,
128
+ decision,
129
+ failures
130
+ });
131
+ }
132
+ return {
133
+ cells,
134
+ missing: config.exhaustive === false ? [] : listPermissions(policy.permissions).map((permission) => permission.key).filter((key) => config.matrix[key] === void 0)
135
+ };
136
+ }
137
+ //#endregion
138
+ //#region src/testing/rls-parity.ts
139
+ function toSubject(input) {
140
+ return {
141
+ principal: {
142
+ id: input.id,
143
+ roles: input.roles ?? [],
144
+ ...input.tenant === void 0 ? {} : { tenant: input.tenant },
145
+ memberships: input.memberships ?? [],
146
+ ...input.claims === void 0 ? {} : { claims: input.claims }
147
+ },
148
+ context: {}
149
+ };
150
+ }
151
+ function rowId(row) {
152
+ return row["id"];
153
+ }
154
+ function setting(name, value) {
155
+ return {
156
+ sql: "select set_config($1, $2, true)",
157
+ values: [name, value]
158
+ };
159
+ }
160
+ /**
161
+ * The session state the generated helpers read: JWT claims for `supabase`, GUCs
162
+ * for `guc` (roles as a comma list, memberships as JSON).
163
+ */
164
+ function subjectSettings(dialect, subject, gucPrefix, tenantClaim, roleClaim, customRoles, scopes) {
165
+ const roles = subject.roles ?? [];
166
+ const memberships = membershipsClaim(subject.memberships ?? [], customRoles, scopes);
167
+ if (dialect === "supabase" || dialect === "neon") {
168
+ const claims = {
169
+ ...subject.claims,
170
+ sub: subject.id,
171
+ role: "authenticated",
172
+ [roleClaim]: roles.length === 1 ? roles[0] : roles,
173
+ [tenantClaim]: subject.tenant,
174
+ memberships
175
+ };
176
+ return [setting("request.jwt.claims", JSON.stringify(claims))];
177
+ }
178
+ const settings = [
179
+ ...Object.entries(subject.claims ?? {}).map(([name, value]) => {
180
+ if (!SQL_IDENT.test(name)) throw new Error(`PermDock: unsafe claim name '${name}'`);
181
+ return setting(`${gucPrefix}.${name}`, typeof value === "string" ? value : JSON.stringify(value));
182
+ }),
183
+ setting(`${gucPrefix}.user_id`, subject.id),
184
+ setting(`${gucPrefix}.${roleClaim}`, roles.join(",")),
185
+ setting(`${gucPrefix}.memberships`, JSON.stringify(memberships))
186
+ ];
187
+ return subject.tenant === void 0 ? settings : [...settings, setting(`${gucPrefix}.${tenantClaim}`, subject.tenant)];
188
+ }
189
+ /**
190
+ * The statement a case runs. With field views it reads back only the key, so a
191
+ * base table whose restricted columns are revoked does not reject it.
192
+ */
193
+ function statementSql(action, table, keyOnly) {
194
+ const quoted = quoteSqlTable(table);
195
+ const id = quoteSqlIdent("id");
196
+ const back = keyOnly ? id : "*";
197
+ const command = defaultSqlCommand(action) ?? "select";
198
+ switch (command) {
199
+ case "select": return `select ${back} from ${quoted} where ${id} = $1`;
200
+ case "update": return `update ${quoted} set ${id} = ${id} where ${id} = $1 returning ${back}`;
201
+ case "insert": return `insert into ${quoted} (${id}) values ($1) returning ${back}`;
202
+ case "delete": return `delete from ${quoted} where ${id} = $1 returning ${back}`;
203
+ default: return command;
204
+ }
205
+ }
206
+ function valued(row) {
207
+ if (row === null || typeof row !== "object") return [];
208
+ const record = row;
209
+ return Object.keys(record).filter((name) => record[name] !== null && record[name] !== void 0).toSorted();
210
+ }
211
+ function isRead(action) {
212
+ return action === "read" || action === "get" || action === "list";
213
+ }
214
+ async function viewColumns(query, table, key) {
215
+ const id = quoteSqlIdent("id");
216
+ await query("savepoint permdock_fields");
217
+ const view = await query(`select * from ${quoteSqlTable(`${table}_visible`)} where ${id} = $1`, [key]);
218
+ if (view.code === void 0) return valued(view.rows[0]);
219
+ await query("rollback to savepoint permdock_fields");
220
+ if (view.code !== "42P01") return view.code;
221
+ const base = await query(`select * from ${quoteSqlTable(table)} where ${id} = $1`, [key]);
222
+ return base.code ?? valued(base.rows[0]);
223
+ }
224
+ function dbOutcome(result) {
225
+ if (result.code === "42501") return "rejected";
226
+ return (result.rowCount ?? result.rows.length) > 0 ? "allowed" : "filtered";
227
+ }
228
+ async function testRlsParity(policy, options) {
229
+ const dialect = options.dialect ?? "guc";
230
+ const gucPrefix = options.gucPrefix ?? "app";
231
+ const tenantClaim = options.tenantClaim ?? "tenant_id";
232
+ const roleClaim = options.roleClaim ?? "user_role";
233
+ const role = options.role ?? "authenticated";
234
+ const customRoles = options.customRoles ?? [];
235
+ const scopes = scopeList(policy.scopes);
236
+ async function runCase(fixture) {
237
+ const permdock = await getPermDock(policy, toSubject(fixture.subject), { customRoles: memoryCustomRoleSource(customRoles) });
238
+ const granted = fixture.permission.kind === "collection" ? permdock.can(fixture.permission, fixture.row) : permdock.can(fixture.permission, fixture.row);
239
+ let fromClient;
240
+ if (options.snapshot === true) {
241
+ const snapshot = permdock.snapshot();
242
+ if (typeof snapshot !== "object" || snapshot instanceof Promise) throw new TypeError("PermDock: testRlsParity needs an unsigned snapshot");
243
+ fromClient = fromSnapshot(parseSnapshot(JSON.stringify(snapshot))).can(fixture.permission, fixture.row);
244
+ }
245
+ await options.query("begin");
246
+ try {
247
+ await options.query(`set local role ${quoteSqlIdent(role === "anon" && dialect === "neon" ? "anonymous" : role)}`);
248
+ for (const item of subjectSettings(dialect, fixture.subject, gucPrefix, tenantClaim, roleClaim, customRoles, scopes)) await options.query(item.sql, item.values);
249
+ const database = dbOutcome(await options.query(statementSql(fixture.permission.action, fixture.table, options.fieldViews === true), [rowId(fixture.row)]));
250
+ const agrees = granted ? database === "allowed" : database === "filtered" || database === "rejected";
251
+ let fields;
252
+ if (options.fieldViews === true && fixture.permission.kind === "instance" && isRead(fixture.permission.action)) {
253
+ const key = policy.resources.get(fixture.permission.resource)?.id ?? "id";
254
+ const kept = new Set(granted ? valued(permdock.pick(fixture.permission, fixture.row)) : []);
255
+ if (granted && fixture.row[key] !== null && fixture.row[key] !== void 0) kept.add(key);
256
+ fields = {
257
+ app: [...kept].toSorted(),
258
+ database: await viewColumns(options.query, fixture.table, rowId(fixture.row))
259
+ };
260
+ }
261
+ const fieldsOk = fields === void 0 || typeof fields.database !== "string" && fields.database.join("\0") === fields.app.join("\0");
262
+ const ok = agrees && fieldsOk && (fromClient === void 0 || fromClient === granted);
263
+ return {
264
+ name: fixture.name,
265
+ granted,
266
+ database,
267
+ ...fromClient === void 0 ? {} : { snapshot: fromClient },
268
+ ...fields === void 0 ? {} : { fields },
269
+ ok
270
+ };
271
+ } finally {
272
+ await options.query("rollback");
273
+ }
274
+ }
275
+ async function runAll(remaining, acc) {
276
+ const [head, ...tail] = remaining;
277
+ if (head === void 0) return acc;
278
+ return runAll(tail, [...acc, await runCase(head)]);
279
+ }
280
+ const results = await runAll(options.fixtures, []);
281
+ return {
282
+ ok: results.every((item) => item.ok),
283
+ results
284
+ };
285
+ }
286
+ //#endregion
287
+ //#region src/testing/orm-parity.ts
288
+ function sortedIds(values) {
289
+ return values.map(String).toSorted();
290
+ }
291
+ function subsetOf(small, large) {
292
+ return small.every((value) => large.includes(value));
293
+ }
294
+ /**
295
+ * ORM parity: for each scenario, the rows `permdock.filter()` keeps in memory
296
+ * must be exactly the rows the database returns for
297
+ * `toWhere(permdock.where())`. With a `relations` option, the graph is loaded
298
+ * for the rows first, so the in-memory side walks the same graph the database
299
+ * query does. A partial `where()` (a closure grant it cannot compile) may be
300
+ * refused or return fewer rows, never more.
301
+ */
302
+ async function testOrmParity(policy, scenarios, options) {
303
+ const idField = options.id ?? "id";
304
+ async function runCase(scenario) {
305
+ const permdock = await getPermDock(policy, scenario.user, scenario.options);
306
+ if (scenario.options?.relations !== void 0) await permdock.prefetchRelations(scenario.permission, scenario.rows);
307
+ const expected = sortedIds(permdock.filter(scenario.permission, scenario.rows).map((row) => row[idField]));
308
+ const where = permdock.where(scenario.permission);
309
+ try {
310
+ const actual = sortedIds(await options.run({
311
+ scenario,
312
+ where
313
+ }));
314
+ const ok = where.partial ? subsetOf(actual, expected) : actual.length === expected.length && subsetOf(actual, expected);
315
+ return {
316
+ name: scenario.name,
317
+ expected,
318
+ actual,
319
+ partial: where.partial,
320
+ ok
321
+ };
322
+ } catch (error) {
323
+ return {
324
+ name: scenario.name,
325
+ expected,
326
+ actual: [],
327
+ partial: where.partial,
328
+ error: error instanceof Error ? error.message : String(error),
329
+ ok: where.partial
330
+ };
331
+ }
332
+ }
333
+ const results = [];
334
+ for (const scenario of scenarios) results.push(await runCase(scenario));
335
+ return {
336
+ ok: results.every((item) => item.ok),
337
+ results
338
+ };
339
+ }
340
+ //#endregion
341
+ export { policyMatrixLayout as i, testRlsParity as n, policyMatrix as r, testOrmParity as t };
@@ -0,0 +1,206 @@
1
+ import { Ln as Decision, T as Policy, or as Membership, tr as CustomRole } from "./policy-types-CCiDRZBH.js";
2
+ import { u as Permission } from "./permission-types-CAY-GU7e.js";
3
+ import { f as WhereResult, o as PermDockOptions } from "./permdock-B6Sf4T_S.js";
4
+ //#region src/testing/policy-matrix.d.ts
5
+ type MatrixOutcome = "granted" | "denied" | "approval-required";
6
+ type MatrixCell = MatrixOutcome | {
7
+ readonly outcome?: MatrixOutcome;
8
+ readonly denials?: readonly {
9
+ readonly role?: string | null;
10
+ readonly reason: string;
11
+ }[];
12
+ readonly alternatives?: readonly string[];
13
+ /**
14
+ * Obligation kinds a granted decision carries, in order; `[]` asserts
15
+ * none.
16
+ */
17
+ readonly obligations?: readonly string[];
18
+ /** The `name` of the deny grant `explain` reports as the one that won. */
19
+ readonly deniedBy?: string;
20
+ };
21
+ type DescribePolicyConfig<TSubject> = {
22
+ readonly subjects: Record<string, TSubject>;
23
+ readonly fixtures?: Record<string, unknown>;
24
+ readonly matrix: Record<string, Record<string, MatrixCell | Record<string, MatrixCell>>>;
25
+ readonly exhaustive?: boolean;
26
+ readonly options?: PermDockOptions;
27
+ /**
28
+ * Also assert every granted or denied cell against
29
+ * `fromSnapshot(permdock.snapshot())`, the client a Server Component hands
30
+ * down. Closures cannot cross a snapshot and deny on the client.
31
+ */
32
+ readonly snapshot?: boolean;
33
+ };
34
+ /** One cell of the matrix, decided. */
35
+ type PolicyMatrixCell = {
36
+ /**
37
+ * `<permission> / <subject>`, or `<permission> / <fixture> / <subject>` for a
38
+ * nested row.
39
+ */
40
+ readonly name: string;
41
+ readonly permission: string;
42
+ readonly subject: string;
43
+ readonly fixture?: string;
44
+ readonly expected: MatrixCell;
45
+ readonly actual: MatrixOutcome;
46
+ readonly decision: Decision;
47
+ /** Each way the decision differs from `expected`; empty when the cell holds. */
48
+ readonly failures: readonly string[];
49
+ };
50
+ type PolicyMatrixReport = {
51
+ readonly cells: readonly PolicyMatrixCell[];
52
+ /** Permission keys the matrix has no row for; empty with `exhaustive: false`. */
53
+ readonly missing: readonly string[];
54
+ };
55
+ /**
56
+ * Decides every cell of a policy matrix with no test runner: each cell lists
57
+ * its `failures`, and `missing` names the permissions an exhaustive matrix
58
+ * leaves out. `describePolicy` asserts the same report under Vitest.
59
+ */
60
+ declare function policyMatrix<TSubject>(policy: Policy, config: DescribePolicyConfig<TSubject>): Promise<PolicyMatrixReport>;
61
+ //#endregion
62
+ //#region src/testing/rls-parity.d.ts
63
+ type RlsDbOutcome = "allowed" | "filtered" | "rejected";
64
+ type RlsParitySubject = {
65
+ readonly id: string;
66
+ readonly roles?: readonly string[];
67
+ readonly tenant?: string;
68
+ readonly memberships?: readonly Membership[];
69
+ /**
70
+ * Extra token claims, read in memory as `principal.claims.*`. They join the
71
+ * JWT claims (`supabase`, `neon`); under `guc` each top-level claim is its
72
+ * own `<prefix>.<name>` setting, strings as is and anything else as JSON.
73
+ */
74
+ readonly claims?: Readonly<Record<string, unknown>>;
75
+ };
76
+ type RlsParityFixture = {
77
+ readonly name: string;
78
+ readonly subject: RlsParitySubject;
79
+ readonly permission: Permission;
80
+ readonly row: Readonly<Record<string, unknown>>;
81
+ readonly table: string;
82
+ };
83
+ type RlsQueryResult = {
84
+ readonly rows: readonly Record<string, unknown>[];
85
+ readonly rowCount?: number;
86
+ readonly code?: string;
87
+ };
88
+ type RlsQueryFn = (sql: string, values?: readonly unknown[]) => Promise<RlsQueryResult>;
89
+ type RlsParityOptions = {
90
+ readonly query: RlsQueryFn;
91
+ readonly fixtures: readonly RlsParityFixture[];
92
+ /**
93
+ * `supabase` and `neon` set `request.jwt.claims`; a test database stubs
94
+ * `auth.jwt()` / `auth.uid()` or `auth.session()` / `auth.user_id()` over
95
+ * it.
96
+ */
97
+ readonly dialect?: "supabase" | "neon" | "guc";
98
+ readonly gucPrefix?: string;
99
+ readonly tenantClaim?: string;
100
+ /**
101
+ * Claim (or `guc` setting) the RLS helpers read global roles from. Default
102
+ * `user_role`.
103
+ */
104
+ readonly roleClaim?: string;
105
+ readonly role?: "authenticated" | "anon";
106
+ /**
107
+ * Tenant-defined roles the subjects' memberships may hold. `decide` resolves
108
+ * them through a `CustomRoleSource`; each membership's claim carries them as
109
+ * the compact `grants` map, which the helpers read in `jwt` mode. Seeding the
110
+ * `database`-mode tables is the caller's job.
111
+ */
112
+ readonly customRoles?: readonly CustomRole[];
113
+ /**
114
+ * Also decide each case from the subject's serialized snapshot
115
+ * (`fromSnapshot`); it must agree.
116
+ */
117
+ readonly snapshot?: boolean;
118
+ /**
119
+ * With `rls generate --fields views`: for each instance read, the row of
120
+ * `<table>_visible` must hold exactly the columns `pick` keeps (plus the key,
121
+ * which always passes through). A table with no view is read directly.
122
+ */
123
+ readonly fieldViews?: boolean;
124
+ };
125
+ /** Columns with a value in the view's row and in `pick`'s result, sorted. */
126
+ type RlsFieldsOutcome = {
127
+ readonly app: readonly string[];
128
+ readonly database: readonly string[] | string;
129
+ };
130
+ type RlsParityCase = {
131
+ readonly name: string;
132
+ readonly granted: boolean;
133
+ readonly database: RlsDbOutcome;
134
+ /** The snapshot's decision, with `snapshot: true`. */
135
+ readonly snapshot?: boolean;
136
+ /**
137
+ * The field view check, with `fieldViews: true`; `database` is an error code
138
+ * when the read failed.
139
+ */
140
+ readonly fields?: RlsFieldsOutcome;
141
+ readonly ok: boolean;
142
+ };
143
+ type RlsParityReport = {
144
+ readonly ok: boolean;
145
+ readonly results: readonly RlsParityCase[];
146
+ };
147
+ declare function testRlsParity<TUser>(policy: Policy<TUser>, options: RlsParityOptions): Promise<RlsParityReport>;
148
+ //#endregion
149
+ //#region src/testing/orm-parity.d.ts
150
+ type OrmParityScenario<TUser = unknown> = {
151
+ readonly name: string;
152
+ /**
153
+ * What the policy's `subject` mapper receives, as in `createPermDock(policy,
154
+ * user)`.
155
+ */
156
+ readonly user: TUser;
157
+ /**
158
+ * The active tenant and role sources, as in `createPermDock(policy, user,
159
+ * options)`.
160
+ */
161
+ readonly options?: PermDockOptions;
162
+ /** An instance permission; its `where()` filters the table. */
163
+ readonly permission: Permission<string, unknown, "instance">;
164
+ /** Every row of the table, exactly as the database holds them. */
165
+ readonly rows: readonly Readonly<Record<string, unknown>>[];
166
+ };
167
+ type OrmParityRunInput<TUser = unknown> = {
168
+ readonly scenario: OrmParityScenario<TUser>;
169
+ readonly where: WhereResult;
170
+ };
171
+ type OrmParityOptions<TUser = unknown> = {
172
+ /**
173
+ * Runs `toWhere(where)` against the database and returns the matching row
174
+ * ids.
175
+ */
176
+ readonly run: (input: OrmParityRunInput<TUser>) => Promise<readonly unknown[]>;
177
+ /** The row id field; default `id`. */
178
+ readonly id?: string;
179
+ };
180
+ type OrmParityCase = {
181
+ readonly name: string;
182
+ readonly expected: readonly string[];
183
+ readonly actual: readonly string[];
184
+ /**
185
+ * `where()` left out a non-portable grant. `toWhere` refusing it is
186
+ * fail-closed and passes; rows it does return must be a subset.
187
+ */
188
+ readonly partial: boolean;
189
+ readonly error?: string;
190
+ readonly ok: boolean;
191
+ };
192
+ type OrmParityReport = {
193
+ readonly ok: boolean;
194
+ readonly results: readonly OrmParityCase[];
195
+ };
196
+ /**
197
+ * ORM parity: for each scenario, the rows `permdock.filter()` keeps in memory
198
+ * must be exactly the rows the database returns for
199
+ * `toWhere(permdock.where())`. With a `relations` option, the graph is loaded
200
+ * for the rows first, so the in-memory side walks the same graph the database
201
+ * query does. A partial `where()` (a closure grant it cannot compile) may be
202
+ * refused or return fewer rows, never more.
203
+ */
204
+ declare function testOrmParity<TUser>(policy: Policy<TUser>, scenarios: readonly OrmParityScenario<TUser>[], options: OrmParityOptions<TUser>): Promise<OrmParityReport>;
205
+ //#endregion
206
+ export { policyMatrix as S, DescribePolicyConfig as _, OrmParityScenario as a, PolicyMatrixCell as b, RlsFieldsOutcome as c, RlsParityOptions as d, RlsParityReport as f, testRlsParity as g, RlsQueryResult as h, OrmParityRunInput as i, RlsParityCase as l, RlsQueryFn as m, OrmParityOptions as n, testOrmParity as o, RlsParitySubject as p, OrmParityReport as r, RlsDbOutcome as s, OrmParityCase as t, RlsParityFixture as u, MatrixCell as v, PolicyMatrixReport as x, MatrixOutcome as y };