permdock 0.3.1 → 0.5.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 (552) hide show
  1. package/README.md +37 -35
  2. package/dist/{openapi-schema--ARjyfQr.js → 2020-C9VN-x8c.js} +5 -132
  3. package/dist/a2a/index.d.ts +8 -6
  4. package/dist/a2a/index.js +21 -31
  5. package/dist/{adapter-context-mlWsVGGg.js → adapter-context-CRhqyzCk.js} +1 -1
  6. package/dist/adoption-scan-B4R5fnMU.js +107 -0
  7. package/dist/agent/index.d.ts +3 -0
  8. package/dist/agent/index.js +1 -0
  9. package/dist/ai-sdk/index.d.ts +18 -23
  10. package/dist/ai-sdk/index.js +38 -21
  11. package/dist/app-data-MuyzVqX8.js +60 -0
  12. package/dist/approval-header-CJACtHkv.js +23 -0
  13. package/dist/approval-prompt-Dg5LeAcT.js +62 -0
  14. package/dist/approval-prompt-Djo_PyZc.d.ts +57 -0
  15. package/dist/approvals/index.d.ts +5 -3
  16. package/dist/approvals/index.js +8 -5
  17. package/dist/approvals-DJ6Yd5z1.js +995 -0
  18. package/dist/{approvers-DT4AVyIg.js → approvers-CqPOLD-o.js} +1 -1
  19. package/dist/arazzo-B6lebmiQ.js +36 -0
  20. package/dist/{arazzo-BAgw9ap6.js → arazzo-BWhNF-k0.js} +24 -17
  21. package/dist/args-IIolxxKA.js +197 -0
  22. package/dist/astro/index.d.ts +43 -0
  23. package/dist/astro/index.js +27 -0
  24. package/dist/audience-Dg8XsRaO.js +55 -0
  25. package/dist/auth-DRLEizbL.js +178 -0
  26. package/dist/authzen/index.d.ts +26 -6
  27. package/dist/authzen/index.js +228 -75
  28. package/dist/automation-BMZPIVUM.d.ts +114 -0
  29. package/dist/automation-DVjOckjV.js +157 -0
  30. package/dist/better-auth/index.d.ts +8 -6
  31. package/dist/better-auth/index.js +11 -23
  32. package/dist/better-supabase/index.d.ts +438 -86
  33. package/dist/better-supabase/index.js +1027 -184
  34. package/dist/bind--9EFVYWF.d.ts +38 -0
  35. package/dist/{bind-CuzGytRf.js → bind-CZzhx-Vj.js} +22 -10
  36. package/dist/body-CH5of8Ne.js +10 -0
  37. package/dist/body-text-QcXok_SI.js +52 -0
  38. package/dist/build-instance-BMnAudHn.js +52 -0
  39. package/dist/{canonical-json-DemiK4Vp.js → canonical-json-BC8_nMTw.js} +6 -6
  40. package/dist/{capability-2kYTMWDv.d.ts → capability-BSslw1QV.d.ts} +44 -25
  41. package/dist/{capability-4qPdO9gk.js → capability-N1K9IpqS.js} +69 -42
  42. package/dist/casbin-Cr7RLtA3.js +30 -0
  43. package/dist/casbin-Dyu2gnUD.js +234 -0
  44. package/dist/casl-64gpT-8x.js +24 -0
  45. package/dist/casl-DjEDhTCP.js +299 -0
  46. package/dist/catalog/index.d.ts +74 -2
  47. package/dist/catalog/index.js +51 -2
  48. package/dist/catalog-BECMPrwc.js +100 -0
  49. package/dist/catalog-DjhMYYCq.js +1 -0
  50. package/dist/catalog-R_A__RsH.js +52 -0
  51. package/dist/{catalog-doc-DdGm82XT.js → catalog-doc-C9wjsfNY.js} +54 -25
  52. package/dist/catalog-fingerprint-CCP0-yQS.js +153 -0
  53. package/dist/chat/index.d.ts +2 -0
  54. package/dist/chat/index.js +224 -0
  55. package/dist/chat-sdk/index.d.ts +87 -0
  56. package/dist/chat-sdk/index.js +197 -0
  57. package/dist/claims-map-7oQ3ue4X.js +13 -0
  58. package/dist/claims-map-Ca-QX8C6.d.ts +32 -0
  59. package/dist/claude-agent/index.d.ts +7 -14
  60. package/dist/claude-agent/index.js +26 -30
  61. package/dist/clerk/index.d.ts +9 -8
  62. package/dist/clerk/index.js +15 -45
  63. package/dist/cli/bin.js +36 -17
  64. package/dist/cli/index.d.ts +20 -6
  65. package/dist/cli/index.js +164 -4
  66. package/dist/cloud/index.d.ts +102 -63
  67. package/dist/cloud/index.js +240 -347
  68. package/dist/cloud-CIoHNevm.js +87 -0
  69. package/dist/codemod-Bmj9dWMH.js +37 -0
  70. package/dist/codemod-Cxvvc70T.js +2084 -0
  71. package/dist/{collect-DSTE3ml9.js → collect-CrZJJnEF.js} +79 -17
  72. package/dist/collect-DloHbDVa.js +55 -0
  73. package/dist/collect-FlXJlhus.js +1 -0
  74. package/dist/command-L8EstFNm.js +6 -0
  75. package/dist/{compact-y6vfu2_f.js → compact-CAf557ZB.js} +11 -1
  76. package/dist/compile/index.d.ts +1 -1
  77. package/dist/compile/index.js +1 -2
  78. package/dist/{compile-Ba4blROR.js → compile-CMqMx_IN.js} +13 -9
  79. package/dist/{compile-BkRyBDBw.d.ts → compile-Ckm2HqBZ.d.ts} +5 -3
  80. package/dist/completion-BqhRBJD8.js +143 -0
  81. package/dist/config-B46rm9sc.js +26 -0
  82. package/dist/{config-BJiM-xAm.js → config-bs_kZeYq.js} +15 -10
  83. package/dist/{config-report-CdCgbRnV.js → config-report-DUgj62Ai.js} +17 -8
  84. package/dist/{connection-CU8MQxRi.js → connection-DjhIJSs2.js} +8 -6
  85. package/dist/constants-DcJABbLW.js +20 -0
  86. package/dist/{context-Bcy85rGi.js → context-bbFHR-0D.js} +16 -5
  87. package/dist/convex/index.d.ts +11 -10
  88. package/dist/convex/index.js +18 -18
  89. package/dist/create-0VZ7Pdiu.d.ts +107 -0
  90. package/dist/create-BDS7wc3y.d.ts +138 -0
  91. package/dist/create-BFfm17UA.d.ts +110 -0
  92. package/dist/create-BWRSXgOF.js +403 -0
  93. package/dist/create-C3b4B5eF.js +130 -0
  94. package/dist/create-DnrmLnLW.js +323 -0
  95. package/dist/{credential-8P81ff4u.js → credential-DM2um3ha.js} +153 -32
  96. package/dist/credentials-DPyHmYz5.js +74 -0
  97. package/dist/deciding-columns-Sq12mEA6.js +123 -0
  98. package/dist/delegation-DaXVdDhM.js +286 -0
  99. package/dist/delegation-input-FTxMK3ji.js +19 -0
  100. package/dist/delivery/index.d.ts +5 -0
  101. package/dist/delivery/index.js +5 -0
  102. package/dist/delivery-DCAgNyCn.js +499 -0
  103. package/dist/delivery-event-xX4obB8F.js +40 -0
  104. package/dist/denied-text-D8jDHgsl.d.ts +19 -0
  105. package/dist/{describe-DMYiCjJV.d.ts → describe-BZUsixiL.d.ts} +11 -2
  106. package/dist/{describe-B_gVZEVi.js → describe-BybMRY7A.js} +10 -5
  107. package/dist/device-BARQ8eYG.js +193 -0
  108. package/dist/diff-CxZo9pTq.js +37 -0
  109. package/dist/{diff-2VaeChzX.js → diff-DCePiN6M.js} +61 -55
  110. package/dist/doctor-CxiwSfqH.js +44 -0
  111. package/dist/doctor-DFjUxf2f.js +2361 -0
  112. package/dist/drizzle/index.d.ts +5 -3
  113. package/dist/drizzle/index.js +6 -14
  114. package/dist/elysia/index.d.ts +16 -13
  115. package/dist/elysia/index.js +14 -13
  116. package/dist/env-DJZrPjRi.js +8 -0
  117. package/dist/errors-BDUwg2qC.js +27 -0
  118. package/dist/{errors-Cz5zn0mW.js → errors-BKy0EfhN.js} +6 -10
  119. package/dist/errors-BWXBMaKK.d.ts +11 -0
  120. package/dist/{errors-DPdqI50v.d.ts → errors-C2PXIv4c.d.ts} +2 -2
  121. package/dist/errors-CWTY6uih.js +143 -0
  122. package/dist/evaluate-_R8QkWaf.js +1732 -0
  123. package/dist/evaluations-16UqqQ6W.d.ts +32 -0
  124. package/dist/{evaluations-tz6D9A2G.js → evaluations-DZ2CbV5k.js} +181 -32
  125. package/dist/eve/index.d.ts +12 -16
  126. package/dist/eve/index.js +23 -29
  127. package/dist/event-time-CsegxXxB.js +23 -0
  128. package/dist/expiry-D4_YKRKD.js +52 -0
  129. package/dist/express/index.d.ts +13 -10
  130. package/dist/express/index.js +14 -12
  131. package/dist/fastify/index.d.ts +26 -13
  132. package/dist/fastify/index.js +17 -36
  133. package/dist/fetch-adapter-g0ypLkID.js +120 -0
  134. package/dist/fetch-adapter-qKJBuRqy.d.ts +31 -0
  135. package/dist/fields-D9tPVUUS.js +203 -0
  136. package/dist/files-C5ZI27eV.js +124 -0
  137. package/dist/{files-DWUN9PzI.js → files-D_JIzUrP.js} +12 -3
  138. package/dist/{fixtures-ht28Cplr.js → fixtures-B7XrLeY7.js} +12 -12
  139. package/dist/flags-C3DktBDY.js +86 -0
  140. package/dist/{from-snapshot-CTLijvdm.js → from-snapshot-D2lZt4Dd.js} +78 -65
  141. package/dist/{generate-CH7ThJ14.js → generate-CNU1pIOo.js} +1 -3
  142. package/dist/grantee-Cn1HyUsI.js +254 -0
  143. package/dist/grantee-conditions-CcXf8hMM.js +271 -0
  144. package/dist/grantee-match-DHArqY82.js +142 -0
  145. package/dist/h3/index.d.ts +37 -0
  146. package/dist/h3/index.js +35 -0
  147. package/dist/headers-BIjfMaoC.js +8 -0
  148. package/dist/headers-CIbDTUTK.d.ts +7 -0
  149. package/dist/{helpers-H_KARDVC.js → helpers-DTcZOzhF.js} +47 -39
  150. package/dist/hono/index.d.ts +12 -9
  151. package/dist/hono/index.js +14 -13
  152. package/dist/{hosted-DJQw46hn.js → hosted-BZIAYvon.js} +64 -15
  153. package/dist/hosted-DBDX0M-P.d.ts +78 -0
  154. package/dist/{http-SO7qGttf.js → http-BBoKefeS.js} +35 -2
  155. package/dist/{http-DPuDaChb.d.ts → http-B_LphE5Y.d.ts} +1 -2
  156. package/dist/http-DXJ37RDA.js +46 -0
  157. package/dist/{http-BIhmLfCc.js → http-ujKm0JXE.js} +3 -26
  158. package/dist/{openapi-import-cmwetbzw.js → import-CNV7I2Dw.js} +30 -26
  159. package/dist/{rls-import-4lLW_pbb.js → import-DMmOG27O.js} +271 -128
  160. package/dist/index-BcHcPyIo.d.ts +110 -0
  161. package/dist/index-CaxrMD1A.d.ts +1 -0
  162. package/dist/index-Chrs5fQ-.d.ts +210 -0
  163. package/dist/index-CxGUswIC.d.ts +431 -0
  164. package/dist/index-D8EovfsP.d.ts +91 -0
  165. package/dist/index-DOVf7RJv.d.ts +900 -0
  166. package/dist/{index-C8z4RjQV.d.ts → index-SGdIQyzc.d.ts} +34 -16
  167. package/dist/index.d.ts +20 -14
  168. package/dist/index.js +33 -23
  169. package/dist/init-DeMYsnYJ.js +96 -0
  170. package/dist/init-GG6Jh8HD.js +95 -0
  171. package/dist/{instance-options-jARdwfPN.d.ts → instance-options-Omfd793B.d.ts} +2 -2
  172. package/dist/instance-snapshot-Cxq4ygFc.js +600 -0
  173. package/dist/instant-BluqDvyS.js +19 -0
  174. package/dist/internals-Dk8A8fX3.js +17 -0
  175. package/dist/{json-schema-BsAflUGW.js → json-schema-B-vAwlde.js} +46 -9
  176. package/dist/json-schema-CN_iLFH2.d.ts +40 -0
  177. package/dist/jwt/index.d.ts +18 -11
  178. package/dist/jwt/index.js +166 -145
  179. package/dist/{kernel-_RRHmnMY.js → kernel-5JatXyND.js} +120 -43
  180. package/dist/kysely/index.d.ts +5 -3
  181. package/dist/kysely/index.js +6 -14
  182. package/dist/{live-options-H2eG8dfJ.js → live-options-BaAFCIiu.js} +16 -3
  183. package/dist/load-BxEtwlBS.js +1 -0
  184. package/dist/{load-DhWEB9P1.js → load-DFS_ry0W.js} +31 -7
  185. package/dist/{load-jose-BL6LH4bL.js → load-jose-DZ4dnjri.js} +1 -4
  186. package/dist/login-Dfe5RlYk.js +68 -0
  187. package/dist/login-imhuwvn3.js +254 -0
  188. package/dist/manifest-C8IzW3Do.js +42 -0
  189. package/dist/manifest-CtKR3GXL.js +370 -0
  190. package/dist/manifest-json-CAGzls-C.js +9 -0
  191. package/dist/{manifest-uDS9y5de.d.ts → manifest-mx5ghSFM.d.ts} +9 -2
  192. package/dist/manifest-schema-C0kK_8V0.js +399 -0
  193. package/dist/{map-claims-Z4QZOiFF.js → map-claims-D3oRmTk0.js} +19 -25
  194. package/dist/{map-error-pgUWNNtG.js → map-error-TCAdw-eW.js} +5 -5
  195. package/dist/{markers-B0hYLvMD.js → markers-C6joDI3o.js} +8 -3
  196. package/dist/mcp/index.d.ts +36 -9
  197. package/dist/mcp/index.js +476 -448
  198. package/dist/{rls-migrate-CN4TlJTO.js → migrate-BShP7Vf4.js} +119 -20
  199. package/dist/nest/index.d.ts +12 -9
  200. package/dist/nest/index.js +20 -20
  201. package/dist/next/index.d.ts +40 -20
  202. package/dist/next/index.js +37 -39
  203. package/dist/next/plugin.d.ts +1 -1
  204. package/dist/next/plugin.js +2 -2
  205. package/dist/node/index.d.ts +10 -10
  206. package/dist/node/index.js +7 -9
  207. package/dist/ocsf-BFp-PZZA.js +126 -0
  208. package/dist/openai/index.d.ts +9 -16
  209. package/dist/openai/index.js +18 -25
  210. package/dist/openapi/index.d.ts +3 -3
  211. package/dist/openapi/index.js +1 -1
  212. package/dist/{openapi-BqRBvAng.js → openapi-B7HZ0f-r.js} +9 -12
  213. package/dist/{openapi-CqqEbHsL.js → openapi-DTaEmTSW.js} +23 -26
  214. package/dist/openapi-ahr8rHu3.js +138 -0
  215. package/dist/operation-findings-DgATDpvh.js +36 -0
  216. package/dist/operations-CxybZErY.d.ts +59 -0
  217. package/dist/orpc/index.d.ts +13 -10
  218. package/dist/orpc/index.js +23 -20
  219. package/dist/otel/index.d.ts +3 -2
  220. package/dist/otel/index.js +53 -27
  221. package/dist/output-Dyw8fyPF.js +88 -0
  222. package/dist/output-files-B3IZJksC.js +1 -0
  223. package/dist/output-files-DhRBBE4n.js +138 -0
  224. package/dist/{rls-fields-CZOMlwHl.js → ownership-BatFgAA4.js} +2393 -2349
  225. package/dist/{package-root-zGkxO3oN.js → package-root-Dk_ETdkp.js} +4 -3
  226. package/dist/{parse-BuyjxhZV.js → parse-Cxq0WxrA.js} +3 -3
  227. package/dist/{parse-local-manifest-BrMozJCo.js → parse-local-manifest-CVSs6J9I.js} +2 -4
  228. package/dist/{parse-local-manifest-JLnaBH0S.d.ts → parse-local-manifest-DgqtruPn.d.ts} +1 -1
  229. package/dist/parse-request-D_tUXG6M.js +26 -0
  230. package/dist/paths-DXSHAMIa.js +42 -0
  231. package/dist/pdp/index.d.ts +7 -3
  232. package/dist/pdp/index.js +47 -29
  233. package/dist/{peer-BOr_kJE1.js → peer-C8swJ2GH.js} +23 -4
  234. package/dist/peer-CRvC7Hg1.js +1 -0
  235. package/dist/permdock-B9JxkBwC.js +868 -0
  236. package/dist/permdock-D7eeLJER.d.ts +502 -0
  237. package/dist/permission-registry-Br4jSNVi.js +385 -0
  238. package/dist/permissions-B-wCP5ZC.js +30 -0
  239. package/dist/{permissions-RJrovw98.js → permissions-CZKiUfFM.js} +4 -3
  240. package/dist/{permissions-CDgvKG5L.d.ts → permissions-oEWfl-kl.d.ts} +1 -2
  241. package/dist/policies-CO1oOymN.js +295 -0
  242. package/dist/{policy-D2W7uv19.d.ts → policy-Czo4n3Hs.d.ts} +2 -2
  243. package/dist/policy-DLZJ5gAp.js +399 -0
  244. package/dist/policy-from-catalog-DzhEc3Y9.js +450 -0
  245. package/dist/policy-module-CTlwMvLI.js +89 -0
  246. package/dist/{policy-IB6yxpC3.d.ts → policy-types-DzwivBgR.d.ts} +939 -1057
  247. package/dist/postgrest-CW0IqC-U.js +566 -0
  248. package/dist/postgrest-NUqZT-RB.d.ts +100 -0
  249. package/dist/powersync-BHfuehf3.js +62 -0
  250. package/dist/powersync-CbzkqL_M.js +1 -0
  251. package/dist/{powersync-Dv1_aWF7.js → powersync-bYUDLOAO.js} +30 -32
  252. package/dist/preset/index.d.ts +146 -0
  253. package/dist/preset/index.js +1 -0
  254. package/dist/preset-DZdU0tne.js +1768 -0
  255. package/dist/principal-source-pHneukrx.js +103 -0
  256. package/dist/prisma/index.d.ts +6 -3
  257. package/dist/prisma/index.js +6 -12
  258. package/dist/{problem-B43ztKIm.js → problem-CTviyH5L.js} +18 -27
  259. package/dist/{problem-details-DX075l9V.d.ts → problem-details-DXlt-vks.d.ts} +1 -1
  260. package/dist/{problem-details-_AMOYz-w.js → problem-details-cn5X30gZ.js} +45 -42
  261. package/dist/problem-types-CJ2325SZ.js +5 -0
  262. package/dist/{prompt-CXYhLfsS.js → prompt-DfZLJLIn.js} +2 -2
  263. package/dist/protected-DEPHc2xV.d.ts +38 -0
  264. package/dist/{protected-utU-SLuy.js → protected-DfjY5mLA.js} +37 -8
  265. package/dist/{provider-CSQd7m92.js → provider-CC-u3bYP.js} +23 -10
  266. package/dist/{provider-DZY281jO.d.ts → provider-DMVt6yYn.d.ts} +1 -1
  267. package/dist/{provider-store-Cfbvo4DE.js → provider-store-B5Yrkhzr.js} +6 -3
  268. package/dist/pull-BgIfno6w.js +256 -0
  269. package/dist/pull-ByOks_Tg.js +1 -0
  270. package/dist/push-CmFVBOeI.js +116 -0
  271. package/dist/pushed-policy-BImMTTIM.d.ts +57 -0
  272. package/dist/pushed-policy-DobP7AHI.js +238 -0
  273. package/dist/react/index.d.ts +8 -8
  274. package/dist/react/index.js +6 -6
  275. package/dist/react/provider-client.d.ts +1 -1
  276. package/dist/react/provider-client.js +1 -2
  277. package/dist/react-native/index.d.ts +24 -63
  278. package/dist/react-native/index.js +45 -27
  279. package/dist/{refs-KYb4ntaz.js → refs-K6eWUJ0H.js} +1 -1
  280. package/dist/relation-walk-3OyDBF0S.js +186 -0
  281. package/dist/relations-BnCWnJGI.js +163 -0
  282. package/dist/renames-CGj7YwcQ.js +175 -0
  283. package/dist/{replay-CYyiLiwO.d.ts → replay-D7iKcLFe.d.ts} +1 -1
  284. package/dist/{replay-BsOyTrdV.js → replay-Du1tJjG7.js} +2 -1
  285. package/dist/request-context-BTRTG7OT.js +71 -0
  286. package/dist/request-context-C2_1lchh.d.ts +5 -0
  287. package/dist/request-schema-CMreVuFM.js +148 -0
  288. package/dist/resend/index.d.ts +126 -0
  289. package/dist/resend/index.js +379 -0
  290. package/dist/resource-relations-D_jw0BFx.js +243 -0
  291. package/dist/retire-CALjIQ7e.js +240 -0
  292. package/dist/{revocations-Cy06JNx2.d.ts → revocations-R07lFBnX.d.ts} +2 -0
  293. package/dist/rls-BA8an5Ap.js +336 -0
  294. package/dist/{rls-DiinlRML.js → rls-j6t43t7n.js} +1066 -1068
  295. package/dist/role-builder-CXbis5-X.js +623 -0
  296. package/dist/{rpc-DL9Sqvb1.js → rpc-aPyNi6tA.js} +18 -8
  297. package/dist/run-CNsApDpd.js +1 -0
  298. package/dist/run-DOfMtc9V.js +723 -0
  299. package/dist/run-ticket-BjhTOi6u.d.ts +124 -0
  300. package/dist/run-ticket-sxFI6LAk.js +337 -0
  301. package/dist/{runtime-CB8gQFvS.js → runtime-D3VTAiCA.js} +1 -1
  302. package/dist/{saas-DhpJjnBA.js → saas-FO-Q8oj0.js} +18 -15
  303. package/dist/scan-BOI5tJ-6.js +29 -0
  304. package/dist/{schema-D3MnDMxa.js → schema-B4v0Qrac.js} +106 -10
  305. package/dist/schema-yLuBWWsh.js +130 -0
  306. package/dist/scim/index.d.ts +2 -2
  307. package/dist/scim/index.js +1 -2
  308. package/dist/{scim-BFGBBAqR.js → scim-ClHtpyV3.js} +213 -87
  309. package/dist/{scopes-CVdPrWN-.js → scopes-CUPSjo9q.js} +20 -7
  310. package/dist/server/index.d.ts +13 -134
  311. package/dist/server/index.js +13 -10
  312. package/dist/server-DqCT4CgZ.js +453 -0
  313. package/dist/{create-B1d519XK.d.ts → server-types-BLd4MnBX.d.ts} +89 -70
  314. package/dist/{sha256-BO0swRXL.js → sha256-D9ihqmvd.js} +8 -1
  315. package/dist/shared-CD11nBbC.js +304 -0
  316. package/dist/{shared-DRu8VFVM.js → shared-DvvFzYXe.js} +8 -9
  317. package/dist/signals-D3NcTKUS.js +32 -0
  318. package/dist/sink-BEZSlMS_.js +957 -0
  319. package/dist/sink-Bj_lDUDq.d.ts +225 -0
  320. package/dist/{skills-Biq5uup3.js → skills-B6lVdD_W.js} +16 -8
  321. package/dist/skills-CTYwkl44.js +51 -0
  322. package/dist/snapshot-CXUWfsNy.js +269 -0
  323. package/dist/{snapshot-cache-D6jLelln.js → snapshot-cache-DZHQ0KF6.js} +11 -5
  324. package/dist/{snapshot-cache-B-LxUahj.d.ts → snapshot-cache-DqK9eDmM.d.ts} +7 -5
  325. package/dist/solid/index.d.ts +24 -25
  326. package/dist/solid/index.js +41 -11
  327. package/dist/solid-start/index.d.ts +52 -0
  328. package/dist/solid-start/index.js +49 -0
  329. package/dist/{sources-BdOYLw9j.d.ts → sources-BV9j0DeZ.d.ts} +11 -13
  330. package/dist/{sources-4p0-4xQm.js → sources-vs5dGOsS.js} +147 -142
  331. package/dist/sql-B5T1IL83.js +55 -0
  332. package/dist/src-DLfUWFAI.js +1851 -0
  333. package/dist/ssf/index.d.ts +4 -4
  334. package/dist/ssf/index.js +440 -106
  335. package/dist/standard-webhooks-6lg8v_is.d.ts +88 -0
  336. package/dist/standard-webhooks-DgFFD-Ga.js +228 -0
  337. package/dist/storage-C2bWdvJH.js +132 -0
  338. package/dist/{store-DMAWwAJV.js → store-4u_hxjWa.js} +42 -55
  339. package/dist/{store-options-ByhZq1jV.js → store-options-BqEakYRa.js} +38 -24
  340. package/dist/{stores-BT2pSCub.js → stores-BbsD4fAR.js} +7 -3
  341. package/dist/stores-ClZUgeoP.d.ts +30 -0
  342. package/dist/{stream-D1RXubw2.d.ts → stream-7-xmnf3U.d.ts} +2 -2
  343. package/dist/{stream-DDpvynSB.js → stream-CvdUS9V1.js} +10 -2
  344. package/dist/style-DiKWnAvn.js +1 -0
  345. package/dist/{style-CTm1AXDT.js → style-Uao76wO7.js} +3 -2
  346. package/dist/subject-BGoM5o8B.js +17 -0
  347. package/dist/{subject-settings-BwBmCdTR.js → subject-settings-CkEwrw3W.js} +23 -5
  348. package/dist/supabase/index.d.ts +23 -106
  349. package/dist/supabase/index.js +5 -4
  350. package/dist/supabase/middleware.d.ts +13 -6
  351. package/dist/supabase/middleware.js +16 -11
  352. package/dist/supabase-9pqI57pW.js +92 -0
  353. package/dist/{supabase-C0qESOa-.js → supabase-Dxlp8A94.js} +124 -247
  354. package/dist/supabase-hook-CXcGpHqq.js +1 -0
  355. package/dist/{supabase-hook-ntETYCQu.js → supabase-hook-DdDQhMlw.js} +1659 -819
  356. package/dist/{supautils-u8jXTGrt.js → supautils-B6HYL9eL.js} +2 -2
  357. package/dist/support-session-C6xJQYut.js +158 -0
  358. package/dist/svelte/Protected.svelte +11 -4
  359. package/dist/svelte/index.d.ts +7 -7
  360. package/dist/svelte/index.js +26 -12
  361. package/dist/svelte/runtime.d.ts +10 -3
  362. package/dist/svelte/runtime.js +4 -3
  363. package/dist/svelte/source.d.ts +7 -7
  364. package/dist/svelte/source.js +5 -5
  365. package/dist/sveltekit/index.d.ts +51 -0
  366. package/dist/sveltekit/index.js +27 -0
  367. package/dist/tanstack-start/index.d.ts +51 -0
  368. package/dist/tanstack-start/index.js +40 -0
  369. package/dist/target-Bw37TFNA.js +51 -0
  370. package/dist/{validity-uOp8UpYn.js → tenancy-DN2QAx9z.js} +6 -42
  371. package/dist/terminal/index.d.ts +11 -9
  372. package/dist/terminal/index.js +36 -316
  373. package/dist/testing/index.d.ts +391 -106
  374. package/dist/testing/index.js +4574 -1286
  375. package/dist/testing/saas/index.d.ts +9 -8
  376. package/dist/testing/saas/index.js +2 -2
  377. package/dist/testing/saas/permissions.d.ts +1 -1
  378. package/dist/testing/saas/permissions.js +1 -2
  379. package/dist/text-BMFRfBqc.js +8 -0
  380. package/dist/{text-diff-BdkkYSbi.js → text-diff-BQcUapOb.js} +1 -1
  381. package/dist/thenable-yD7SabqG.js +31 -0
  382. package/dist/time-DkWjdL98.js +71 -0
  383. package/dist/{token-CIWxJOCh.js → token-BLZcjQgt.js} +15 -6
  384. package/dist/tool-refusal-CMLN5xhn.js +41 -0
  385. package/dist/trpc/index.d.ts +12 -9
  386. package/dist/trpc/index.js +18 -17
  387. package/dist/{types-DbjRN55U.d.ts → types-5Ut_pbKy.d.ts} +141 -13
  388. package/dist/types-BNORmDM8.d.ts +172 -0
  389. package/dist/types-BjV-fqcA.d.ts +57 -0
  390. package/dist/{types-QCuYJh4q.d.ts → types-BqAKcRNW.d.ts} +2 -1
  391. package/dist/types-C8-KNsFf.d.ts +107 -0
  392. package/dist/{types-aqOHTHcp.d.ts → types-CCpc2Dcv.d.ts} +77 -17
  393. package/dist/{types-Dnemwd77.d.ts → types-CZTnPFzM.d.ts} +50 -11
  394. package/dist/{types-C97IskBw.d.ts → types-CdlxsYQh.d.ts} +23 -11
  395. package/dist/{types-DxiCGmmd.d.ts → types-ClZaWzfb.d.ts} +9 -6
  396. package/dist/types-DX0LaKTb.d.ts +157 -0
  397. package/dist/types-DiQjupG2.d.ts +332 -0
  398. package/dist/types-DqzsnlSA.js +67 -0
  399. package/dist/types-_sHy8BQf.d.ts +65 -0
  400. package/dist/types-fbZ7JEXr.d.ts +89 -0
  401. package/dist/types-tIgIeIKJ.d.ts +66 -0
  402. package/dist/unplugin/index.d.ts +1 -1
  403. package/dist/unplugin/index.js +2 -2
  404. package/dist/usage-CHOtwL19.js +1 -0
  405. package/dist/usage-DHtE8j4E.js +32 -0
  406. package/dist/{usage-ItS7nLcl.js → usage-T5mXq98v.js} +56 -13
  407. package/dist/{validation-error-Ba264OaJ.d.ts → validation-error-Bg5Tpluk.d.ts} +1 -1
  408. package/dist/{validation-error-CnjZ4t92.js → validation-error-ZfUHbKvf.js} +1 -1
  409. package/dist/validity-CZ7-y0Cj.js +79 -0
  410. package/dist/{verifier-BxBo6I44.js → verifier-DHuh-okk.js} +68 -21
  411. package/dist/verify-DbCL9bnB.js +1770 -0
  412. package/dist/{version-BvacVTZR.js → version-CEbQ5UeM.js} +4 -3
  413. package/dist/version-DXkYUISx.js +1 -0
  414. package/dist/{views-Soe7bGSC.js → views-DTIIO-oQ.js} +41 -2
  415. package/dist/{permissions-DttnqqxC.d.ts → vocabulary-D6lPdb4Z.d.ts} +120 -29
  416. package/dist/vue/index.d.ts +25 -21
  417. package/dist/vue/index.js +25 -9
  418. package/dist/waiter-BGUtGYoU.js +67 -0
  419. package/dist/waiter-CKy4MQSY.d.ts +36 -0
  420. package/dist/watch-Cb-NcaUw.js +1 -0
  421. package/dist/{watch-DVBJ9cBq.js → watch-CszoTJMq.js} +47 -8
  422. package/dist/webmcp/index.d.ts +2 -2
  423. package/dist/webmcp/index.js +13 -37
  424. package/dist/where-scope-Dv-WTP-w.js +306 -0
  425. package/dist/who-can-D0QoYbEb.js +364 -0
  426. package/dist/wire-delegation-Cv3W2eaM.js +36 -0
  427. package/dist/wire-denial-C7PaVYEM.js +27 -0
  428. package/dist/workflow/index.d.ts +5 -0
  429. package/dist/workflow/index.js +223 -0
  430. package/dist/workflow-sdk/index.d.ts +56 -0
  431. package/dist/workflow-sdk/index.js +78 -0
  432. package/dist/wrap-Bd1Tejur.d.ts +15 -0
  433. package/dist/wrap-gX61EtpB.js +27 -0
  434. package/package.json +140 -41
  435. package/schemas/access-event-v1.json +118 -0
  436. package/schemas/approval-request-v1.json +34 -1
  437. package/schemas/approval-signature-v1.json +94 -0
  438. package/schemas/automation-event-v1.json +113 -0
  439. package/schemas/capability-v1.json +84 -0
  440. package/schemas/catalog-event-v1.json +87 -0
  441. package/schemas/catalog-v1.json +129 -12
  442. package/schemas/cli-commands-v1.json +164 -0
  443. package/schemas/cli-result-v1.json +96 -0
  444. package/schemas/cloud-api-v1.json +5407 -0
  445. package/schemas/connector-v1.json +408 -0
  446. package/schemas/credential-event-v1.json +81 -0
  447. package/schemas/credential-v1.json +134 -0
  448. package/schemas/decision-event-v1.json +288 -0
  449. package/schemas/delivery-event-v1.json +117 -0
  450. package/schemas/directory-event-v1.json +85 -0
  451. package/schemas/evidence-export-v1.json +54 -0
  452. package/schemas/membership-event-v1.json +93 -0
  453. package/schemas/policy-v1.json +68 -0
  454. package/schemas/pushed-policy-v1.json +236 -0
  455. package/schemas/run-v1.json +162 -0
  456. package/schemas/snapshot-v1.json +138 -0
  457. package/schemas/supabase-claims-v1.json +4 -4
  458. package/schemas/supabase-manifest-v1.json +5 -1
  459. package/schemas/support-session-v1.json +111 -0
  460. package/skills/permdock/SKILL.md +16 -12
  461. package/skills/permdock-agents/SKILL.md +40 -23
  462. package/skills/permdock-agents/references/operations-automations-chat.md +221 -0
  463. package/skills/permdock-agents/references/runtimes.md +22 -18
  464. package/skills/permdock-approvals/SKILL.md +29 -13
  465. package/skills/permdock-approvals/references/delivery-and-waiters.md +172 -0
  466. package/skills/permdock-approvals/references/stores-and-resume.md +21 -7
  467. package/skills/permdock-audit/SKILL.md +3 -3
  468. package/skills/permdock-credentials/SKILL.md +5 -5
  469. package/skills/permdock-credentials/references/tokens-keys-links.md +19 -10
  470. package/skills/permdock-data/SKILL.md +6 -6
  471. package/skills/permdock-data/references/queries-and-rls.md +13 -8
  472. package/skills/permdock-data/references/relationships.md +3 -3
  473. package/skills/permdock-tenancy/SKILL.md +20 -7
  474. package/skills/permdock-tenancy/references/contacts-and-support-sessions.md +122 -0
  475. package/skills/permdock-tenancy/references/ownership-and-custom-roles.md +6 -4
  476. package/skills/permdock-wire/SKILL.md +18 -12
  477. package/skills/permdock-wire/references/adapters.md +146 -50
  478. package/skills/permdock-wire/references/policy-options.md +15 -6
  479. package/skills/permdock-wire/references/presets-and-recipes.md +58 -0
  480. package/dist/approvals-DbYAuNkG.js +0 -224
  481. package/dist/arazzo-C9chp3ST.js +0 -54
  482. package/dist/bind-C_ob3LKa.d.ts +0 -25
  483. package/dist/catalog-CRW5Mx_B.js +0 -2
  484. package/dist/catalog-CYj-mX2O.js +0 -48
  485. package/dist/catalog-DWF5cYqB.js +0 -55
  486. package/dist/cloud-CfwZ39Rl.js +0 -50
  487. package/dist/cloud-DWLXO2af.js +0 -118
  488. package/dist/collect-CHB22Sx4.js +0 -83
  489. package/dist/collect-DSWOk19R.js +0 -2
  490. package/dist/commands-BeaGNj_o.js +0 -97
  491. package/dist/config-ir40y8m0.js +0 -36
  492. package/dist/create-CMwIl-w2.js +0 -253
  493. package/dist/delegation-D8pUEuce.js +0 -103
  494. package/dist/diff-C9RDjjhs.js +0 -48
  495. package/dist/doctor-Djh6JDEk.js +0 -53
  496. package/dist/doctor-DvH0IQff.js +0 -1194
  497. package/dist/doctor-collect-CjdO0wQX.js +0 -665
  498. package/dist/duration-xK2jGFVc.js +0 -25
  499. package/dist/errors-CWfoNg9N.js +0 -47
  500. package/dist/errors-DRnGZHzF.js +0 -30
  501. package/dist/evaluation-items-CfCCejQd.js +0 -40
  502. package/dist/expiry-BoBJ8Tvc.js +0 -7
  503. package/dist/fields-BMl1RxoX.js +0 -26
  504. package/dist/grantee-Cv5Sogfv.js +0 -602
  505. package/dist/headers-BZSDieNT.js +0 -6
  506. package/dist/headers-Cf-zWvsO.d.ts +0 -6
  507. package/dist/ids-DC4V4CFu.js +0 -18
  508. package/dist/index-0nNqHspG.d.ts +0 -6
  509. package/dist/index-BNc7Wer_.d.ts +0 -483
  510. package/dist/index-C7Tw7MaW.d.ts +0 -201
  511. package/dist/instance-options-Dhhcnm3y.js +0 -22
  512. package/dist/load-DwJUafYN.js +0 -2
  513. package/dist/manifest-iaoBXHKc.js +0 -783
  514. package/dist/map-AcxK9o_D.js +0 -147
  515. package/dist/may-use-DndQ5tQ-.js +0 -77
  516. package/dist/openapi-CQTsgKoB.js +0 -164
  517. package/dist/permdock-CbgvLnuo.js +0 -3479
  518. package/dist/permissions-DVoF6dMt.js +0 -662
  519. package/dist/policy-xyWg7QdR.js +0 -1122
  520. package/dist/powersync-CrBX8hY6.js +0 -2
  521. package/dist/powersync-DE19b9dT.js +0 -62
  522. package/dist/protected-BdnIEFkY.d.ts +0 -27
  523. package/dist/protected-xAr24FEC.d.ts +0 -40
  524. package/dist/relations-cjOL01hZ.js +0 -505
  525. package/dist/rls-P-BeBx0n.js +0 -238
  526. package/dist/rls-graph-CHwx0V8q.js +0 -435
  527. package/dist/rls-ownership-DcYlZ09B.js +0 -843
  528. package/dist/rls-shared-Cewd_-zI.js +0 -495
  529. package/dist/rls-verify-CMv9H3wV.js +0 -746
  530. package/dist/run-BWc9qqvE.js +0 -174
  531. package/dist/server-DlZ28Oz5.js +0 -268
  532. package/dist/sink-B1fZzIMf.d.ts +0 -104
  533. package/dist/sink-Bd9PSyfq.js +0 -141
  534. package/dist/skills-C5CbhhpG.js +0 -56
  535. package/dist/snapshot-Enxd0n-s.js +0 -975
  536. package/dist/sql-xdg5f4Fi.js +0 -27
  537. package/dist/src-BDwEZWrZ.js +0 -568
  538. package/dist/store-jOBYpiXC.d.ts +0 -36
  539. package/dist/stores-C0IMQrGI.d.ts +0 -52
  540. package/dist/subject-C6dLxqHU.js +0 -24
  541. package/dist/supabase-config-Bj3iDH2I.js +0 -472
  542. package/dist/supabase-hook-gd3s8bxB.js +0 -2
  543. package/dist/supabase-s4o9s1O1.js +0 -83
  544. package/dist/thenable-okc2xDsj.js +0 -10
  545. package/dist/types-BnIEz1sU.d.ts +0 -48
  546. package/dist/types-Bvc4oWT6.d.ts +0 -9
  547. package/dist/types-CKNSyIf_.d.ts +0 -52
  548. package/dist/types-Cq_H8N_X.d.ts +0 -197
  549. package/dist/usage-B0YuTQRO.js +0 -42
  550. package/dist/usage-DorAJiU_.js +0 -2
  551. package/dist/vocabulary-DA8a8zif.d.ts +0 -56
  552. package/dist/watch-BwxLTYMZ.js +0 -2
@@ -1,746 +0,0 @@
1
- import { _ as listPermissions, d as isEdgeRelation, f as isFieldRelation, i as findPermission, m as isPrincipalRelation } from "./permissions-DVoF6dMt.js";
2
- import { a as hasConditionOp } from "./refs-KYb4ntaz.js";
3
- import { _ as memoryRoleSource } from "./src-BDwEZWrZ.js";
4
- import { d as scopeList } from "./scopes-CVdPrWN-.js";
5
- import { g as customRoleScope, t as createPermDock, v as membershipsClaim } from "./permdock-CbgvLnuo.js";
6
- import { t as memoryRelations } from "./relations-cjOL01hZ.js";
7
- import { i as describeError, o as usageResult } from "./errors-CWfoNg9N.js";
8
- import { t as policyRowConditionKeys } from "./row-conditions-h2HythXQ.js";
9
- import { o as jsonSchemaOf } from "./catalog-doc-DdGm82XT.js";
10
- import { a as loadModule, n as asPolicy, o as pickNamed } from "./load-DhWEB9P1.js";
11
- import "./budget-NbEtbJC_.js";
12
- import "./sources-4p0-4xQm.js";
13
- import { G as quoteIdent, K as quoteLiteral, b as columnTypesOf, q as quoteTable } from "./rls-shared-Cewd_-zI.js";
14
- import { p as commandFor, s as viewName, t as FIELD_VIEWS, w as connectPg } from "./rls-fields-CZOMlwHl.js";
15
- import { a as HELPER_TABLE_POLICIES_SQL, d as rowConditionMessage, n as graphPlan, u as helperTablePoliciesFromRows } from "./rls-graph-CHwx0V8q.js";
16
- import { n as fixtureSubject, r as loadFixtures, t as fixtureRow } from "./fixtures-ht28Cplr.js";
17
- import { resolve } from "node:path";
18
- import { randomUUID } from "node:crypto";
19
- //#region src/cli/rls-verify-tree.ts
20
- const SUBJECTS = 3;
21
- function tableSql(name) {
22
- return quoteTable(name.includes(".") ? name : `public.${name}`);
23
- }
24
- function idFactory(node) {
25
- const type = columnTypesOf(jsonSchemaOf(node))[node.id];
26
- let next = 9e5;
27
- return type === "numeric" ? () => {
28
- next += 1;
29
- return next;
30
- } : () => randomUUID();
31
- }
32
- /**
33
- * Two spines one level deeper than the walk depth, so the depth cap is
34
- * crossed; side branches under the first levels alternate restricted, and
35
- * the second spine is restricted two levels down.
36
- */
37
- function generateTree(node, depth) {
38
- const id = idFactory(node);
39
- const nodes = [];
40
- for (const spine of [0, 1]) {
41
- let parent = null;
42
- for (let level = 0; level <= depth + 1; level += 1) {
43
- const current = id();
44
- nodes.push({
45
- id: current,
46
- parent,
47
- restricted: node.restricted !== void 0 && spine === 1 && level === 2
48
- });
49
- if (spine === 0 && level >= 1 && level <= 3) {
50
- const side = id();
51
- nodes.push({
52
- id: side,
53
- parent: current,
54
- restricted: node.restricted !== void 0 && level % 2 === 1
55
- });
56
- nodes.push({
57
- id: id(),
58
- parent: side,
59
- restricted: false
60
- });
61
- }
62
- parent = current;
63
- }
64
- }
65
- return nodes;
66
- }
67
- function insertSql(table, rows) {
68
- const columns = Object.keys(rows[0] ?? {});
69
- const values = [];
70
- const tuples = rows.map((row) => `(${columns.map((column) => {
71
- values.push(row[column]);
72
- return `$${String(values.length)}`;
73
- }).join(", ")})`);
74
- return {
75
- sql: `insert into ${tableSql(table)} (${columns.map(quoteIdent).join(", ")}) values ${tuples.join(", ")} returning *`,
76
- values
77
- };
78
- }
79
- const REQUIRED_COLUMNS_SQL = `select a.attname as name,
80
- format_type(a.atttypid, a.atttypmod) as type,
81
- k.confrelid::regclass::text as "refTable",
82
- r.attname as "refColumn",
83
- (select e.enumlabel from pg_enum e where e.enumtypid = a.atttypid order by e.enumsortorder limit 1) as "enumLabel",
84
- array(
85
- select pg_get_constraintdef(c.oid) from pg_constraint c
86
- where c.conrelid = a.attrelid and c.contype = 'c' and c.conkey = array[a.attnum]
87
- order by c.conname
88
- ) as checks
89
- from pg_attribute a
90
- left join pg_constraint k
91
- on k.conrelid = a.attrelid and k.contype = 'f' and k.conkey = array[a.attnum]
92
- left join pg_attribute r
93
- on r.attrelid = k.confrelid and r.attnum = k.confkey[1]
94
- where a.attrelid = $1::regclass and a.attnum > 0 and not a.attisdropped
95
- and a.attnotnull and not a.atthasdef
96
- and a.attidentity = '' and a.attgenerated = ''`;
97
- const UNIQUE_COLUMNS_SQL = `select distinct a.attname as name
98
- from pg_index i
99
- join pg_attribute a on a.attrelid = i.indrelid
100
- where i.indrelid = $1::regclass and i.indisunique
101
- and a.attnum > 0 and not a.attisdropped
102
- and (
103
- a.attnum = any(i.indkey)
104
- or exists (
105
- select 1 from pg_depend d
106
- where d.classid = 'pg_class'::regclass and d.objid = i.indexrelid
107
- and d.refclassid = 'pg_class'::regclass and d.refobjid = i.indrelid
108
- and d.refobjsubid = a.attnum
109
- )
110
- )`;
111
- function checkedValue(checks) {
112
- for (const check of checks) {
113
- const literal = /'((?:[^']|'')*)'/u.exec(check);
114
- if (literal?.[1] !== void 0 && /[=]|\bin\b/iu.test(check)) return literal[1].replaceAll("''", "'");
115
- const bound = /(>=?)\s*\(?(-?\d+(?:\.\d+)?)/u.exec(check);
116
- if (bound?.[1] !== void 0 && bound[2] !== void 0) {
117
- const value = Number(bound[2]);
118
- return bound[1] === ">" ? Math.floor(value) + 1 : value;
119
- }
120
- }
121
- }
122
- function placeholder(column) {
123
- if (column.enumLabel !== null) return column.enumLabel;
124
- const checked = checkedValue(column.checks);
125
- if (checked !== void 0) return checked;
126
- const type = column.type;
127
- if (type === "uuid") return randomUUID();
128
- if (type === "boolean") return false;
129
- if (/^(smallint|integer|bigint|numeric|real|double precision)/u.test(type)) return 0;
130
- if (type.startsWith("timestamp") || type === "date") return (/* @__PURE__ */ new Date()).toISOString();
131
- if (type === "json" || type === "jsonb") return {};
132
- return "permdock-tree";
133
- }
134
- function distinctPlaceholder(column, index) {
135
- const value = placeholder(column);
136
- if (column.enumLabel !== null) return value;
137
- if (typeof value === "number") return value + index;
138
- if (typeof value !== "string" || checkedValue(column.checks) !== void 0) return value;
139
- if (column.type === "uuid") return value;
140
- if (column.type.startsWith("timestamp") || column.type === "date") return new Date(Date.parse(value) + index * 864e5).toISOString();
141
- return `${value}-${String(index + 1)}`;
142
- }
143
- function asRequiredColumn(row) {
144
- const { name, type, refTable, refColumn, enumLabel, checks } = row;
145
- if (typeof name !== "string" || typeof type !== "string") return;
146
- return {
147
- name,
148
- type,
149
- refTable: typeof refTable === "string" ? refTable : null,
150
- refColumn: typeof refColumn === "string" ? refColumn : null,
151
- enumLabel: typeof enumLabel === "string" ? enumLabel : null,
152
- checks: Array.isArray(checks) ? checks.filter((check) => typeof check === "string") : []
153
- };
154
- }
155
- /**
156
- * Values for the required columns a generated row leaves out, such as a
157
- * tenant column or a name: an existing value of the referenced table for a
158
- * foreign key, a placeholder of the column's type otherwise.
159
- */
160
- async function requiredValues(query, table, set) {
161
- const columns = (await query(REQUIRED_COLUMNS_SQL, [table])).rows.map(asRequiredColumn).filter((column) => column !== void 0 && !set.has(column.name));
162
- const unique = new Set(columns.length === 0 ? [] : (await query(UNIQUE_COLUMNS_SQL, [table])).rows.map((row) => String(row["name"])));
163
- const values = {};
164
- const distinct = [];
165
- for (const column of columns) if (column.refTable !== null && column.refColumn !== null) {
166
- const existing = await query(`select ${quoteIdent(column.refColumn)} as value from ${column.refTable} limit 1`);
167
- values[column.name] = existing.rows[0]?.["value"] ?? null;
168
- } else if (unique.has(column.name)) distinct.push(column);
169
- else values[column.name] = placeholder(column);
170
- return (index) => {
171
- const row = { ...values };
172
- for (const column of distinct) row[column.name] = distinctPlaceholder(column, index);
173
- return row;
174
- };
175
- }
176
- /** Inserts `rows` after filling the required columns they leave out. */
177
- async function seedRows(query, table, rows, given = {}) {
178
- const fill = await requiredValues(query, tableSql(table), /* @__PURE__ */ new Set([...Object.keys(rows[0] ?? {}), ...Object.keys(given)]));
179
- const inserted = insertSql(table, rows.map((row, index) => ({
180
- ...fill(index),
181
- ...given,
182
- ...row
183
- })));
184
- return (await query(inserted.sql, inserted.values)).rows;
185
- }
186
- /**
187
- * Parity between `decide` and RLS on a generated object graph: for every
188
- * self-parented resource a graph grant walks, a tree with restricted
189
- * branches and a chain past the walk depth, child rows under it, and edges
190
- * for a few generated principals. Everything runs in one transaction that
191
- * is rolled back.
192
- */
193
- async function verifyTree(input) {
194
- const { policy, query } = input;
195
- const tables = input.config.rls?.tables;
196
- const treeValues = input.config.rls?.treeValues ?? {};
197
- const seed = (table, list) => seedRows(query, table, list, treeValues[table] ?? {});
198
- const walked = [...graphPlan(policy).values()].filter((entry) => entry.closure !== void 0);
199
- if (walked.length === 0) return {
200
- checked: 0,
201
- granted: 0,
202
- mismatches: [],
203
- notes: ["no graph grant walks a self-parented resource"]
204
- };
205
- const subjects = Array.from({ length: SUBJECTS }, () => randomUUID());
206
- const rows = {};
207
- const edges = {};
208
- const now = Date.now();
209
- for (const entry of walked) {
210
- const node = entry.node;
211
- const parent = node.parent;
212
- if (parent === void 0) continue;
213
- const tree = generateTree(node, entry.closure ?? 0);
214
- const seeded = tree.map((item, index) => {
215
- const row = {
216
- [node.id]: item.id,
217
- [parent.field]: item.parent
218
- };
219
- if (node.restricted !== void 0) row[node.restricted] = item.restricted;
220
- for (const name of entry.relations) {
221
- const spec = node.relations[name];
222
- const column = isFieldRelation(spec) ? spec.memberOf === void 0 ? spec.field : void 0 : isPrincipalRelation(spec) ? spec.principal : void 0;
223
- if (column !== void 0 && column !== parent.field) row[column] = index % 4 === 0 ? subjects[index % SUBJECTS] : randomUUID();
224
- }
225
- return row;
226
- });
227
- if ([...entry.relations].some((name) => {
228
- const spec = node.relations[name];
229
- return isPrincipalRelation(spec) && spec.principal === parent.field || isFieldRelation(spec) && spec.field === parent.field;
230
- })) subjects.push(...tree.filter((_, index) => index % 3 === 0).map((item) => String(item.id)));
231
- rows[node.name] = [...await seed(tables?.[node.name] ?? node.name, seeded)];
232
- for (const name of entry.relations) {
233
- const spec = node.relations[name];
234
- if (!isEdgeRelation(spec)) continue;
235
- const object = spec.object ?? `${node.name}_id`;
236
- const subject = spec.subject ?? "user_id";
237
- const list = [];
238
- const edgeRows = [];
239
- for (const [index, item] of tree.entries()) {
240
- const holder = subjects[index % SUBJECTS];
241
- if (holder === void 0 || index % 5 !== 1) continue;
242
- const expiresAt = spec.expiresAt !== void 0 && index % 10 === 6 ? /* @__PURE__ */ new Date(now - 864e5) : void 0;
243
- edgeRows.push({
244
- [object]: item.id,
245
- [subject]: holder,
246
- ...spec.expiresAt === void 0 ? {} : { [spec.expiresAt]: expiresAt ?? null }
247
- });
248
- list.push({
249
- id: String(item.id),
250
- principal: holder,
251
- ...expiresAt === void 0 ? {} : { expiresAt: expiresAt.getTime() / 1e3 }
252
- });
253
- }
254
- if (edgeRows.length > 0) await seed(spec.edge, edgeRows);
255
- edges[node.name] = {
256
- ...edges[node.name],
257
- [name]: list
258
- };
259
- }
260
- for (const child of policy.resources.values()) {
261
- if (child.name === node.name || child.parent?.resource !== node.name) continue;
262
- const make = idFactory(child);
263
- const childRows = tree.map((item, index) => {
264
- const row = {
265
- [child.id]: make(),
266
- [child.parent?.field ?? ""]: item.id
267
- };
268
- if (child.restricted !== void 0) row[child.restricted] = index % 7 === 3;
269
- return row;
270
- });
271
- rows[child.name] = [...await seed(tables?.[child.name] ?? child.name, childRows)];
272
- }
273
- }
274
- const relations = memoryRelations(policy.permissions, {
275
- rows,
276
- edges
277
- });
278
- const mismatches = [];
279
- let checked = 0;
280
- let granted = 0;
281
- const reads = listPermissions(policy.permissions).filter((leaf) => leaf.kind === "instance" && commandFor(leaf.action, input.config.rls?.actions) === "select" && rows[leaf.resource] !== void 0);
282
- for (const subject of subjects) {
283
- const permdock = await createPermDock(policy, {
284
- principal: {
285
- id: subject,
286
- roles: []
287
- },
288
- context: {}
289
- }, { relations });
290
- await input.bind(subject);
291
- for (const permission of reads) {
292
- const node = policy.resources.get(permission.resource);
293
- const list = rows[permission.resource] ?? [];
294
- if (node === void 0 || list.length === 0) continue;
295
- const ids = list.map((row) => String(row[node.id]));
296
- const visible = await query(`select ${quoteIdent(node.id)}::text as id from ${tableSql(tables?.[node.name] ?? node.name)} where ${quoteIdent(node.id)} = any($1)`, [ids]);
297
- const seen = new Set(visible.rows.map((row) => String(row["id"])));
298
- for (const row of list) {
299
- checked += 1;
300
- const id = String(row[node.id]);
301
- const allowed = permdock.can(permission, row);
302
- if (allowed !== seen.has(id)) mismatches.push(`${permission.key} ${id}: in-process ${allowed ? "granted" : "denied"}, database ${seen.has(id) ? "allowed" : "filtered"}`);
303
- else if (allowed) granted += 1;
304
- }
305
- }
306
- }
307
- return {
308
- checked,
309
- granted,
310
- mismatches,
311
- notes: []
312
- };
313
- }
314
- //#endregion
315
- //#region src/cli/rls-verify.ts
316
- function isRecord(value) {
317
- return value !== null && typeof value === "object" && !Array.isArray(value);
318
- }
319
- /** A custom role's scope and pinned instance, as the `custom_role_*` tables store them. */
320
- function customRoleAt(role, scopes) {
321
- return {
322
- scope: customRoleScope(role, scopes),
323
- id: role.scope === void 0 ? role.team : role.id
324
- };
325
- }
326
- function canFixture(permdock, permission, row) {
327
- if (permission.kind === "collection") return permdock.can(permission, row);
328
- return permdock.can(permission, row);
329
- }
330
- function grantKind(policy, key) {
331
- const grants = policy.grants.filter((grant) => grant.permission.key === key);
332
- if (grants.some((grant) => hasConditionOp(grant.where, "opaque") || hasConditionOp(grant.check, "opaque"))) return "opaque";
333
- if (grants.some((grant) => hasConditionOp(grant.where, "sqlFunction") || hasConditionOp(grant.check, "sqlFunction"))) return "sqlFunction";
334
- return "portable";
335
- }
336
- function columnsOf(row) {
337
- return isRecord(row) ? Object.entries(row).filter(([, value]) => value !== void 0 && typeof value !== "object") : [];
338
- }
339
- /**
340
- * The statement a fixture runs: `create` inserts the whole row, `update` writes
341
- * `newRow` when given. Each reads back only the key, so `--revoke-columns`
342
- * (which keeps only unrestricted columns readable) does not reject it.
343
- */
344
- function statementFor(fixture, action, table) {
345
- const quoted = quoteTable(table);
346
- const id = quoteIdent("id");
347
- const key = rowId(fixture.row);
348
- switch (action) {
349
- case "read":
350
- case "list":
351
- case "get": return {
352
- sql: `select ${id} from ${quoted} where ${id} = $1`,
353
- values: [key]
354
- };
355
- case "update": {
356
- const next = columnsOf(fixture.newRow).filter(([name]) => name !== "id");
357
- return {
358
- sql: `update ${quoted} set ${next.length === 0 ? `${id} = ${id}` : next.map(([name], index) => `${quoteIdent(name)} = $${index + 2}`).join(", ")} where ${id} = $1 returning ${id}`,
359
- values: [key, ...next.map(([, value]) => value)]
360
- };
361
- }
362
- case "create": {
363
- const cols = columnsOf(fixture.row);
364
- if (cols.length === 0) return {
365
- sql: `insert into ${quoted} (${id}) values ($1) returning ${id}`,
366
- values: [key]
367
- };
368
- return {
369
- sql: `insert into ${quoted} (${cols.map(([name]) => quoteIdent(name)).join(", ")}) values (${cols.map((_, index) => `$${index + 1}`).join(", ")}) returning ${id}`,
370
- values: cols.map(([, value]) => value)
371
- };
372
- }
373
- case "delete": return {
374
- sql: `delete from ${quoted} where ${id} = $1 returning ${id}`,
375
- values: [key]
376
- };
377
- default: return {
378
- sql: `select ${id} from ${quoted} where ${id} = $1`,
379
- values: [key]
380
- };
381
- }
382
- }
383
- function rowId(row) {
384
- if (isRecord(row) && "id" in row) return row["id"];
385
- }
386
- /** A fixture value as a SQL literal; untyped, so it coerces to the column like a bound parameter. */
387
- function sqlValue(value) {
388
- if (value === null || value === void 0) return "null";
389
- return quoteLiteral(typeof value === "string" ? value : JSON.stringify(value));
390
- }
391
- function inlineStatement(statement) {
392
- return statement.sql.replaceAll(/\$(\d+)/gu, (_, index) => sqlValue(statement.values[Number(index) - 1]));
393
- }
394
- const PGTAP_DECISION = "pg_temp.permdock_decision";
395
- const PGTAP_DECISION_SQL = `create function ${PGTAP_DECISION}(statement text) returns text
396
- language plpgsql
397
- as $$
398
- declare
399
- affected bigint;
400
- begin
401
- execute statement;
402
- get diagnostics affected = row_count;
403
- return case when affected > 0 then 'granted' else 'denied' end;
404
- exception
405
- when others then
406
- return 'denied';
407
- end;
408
- $$;`;
409
- function subjectOf(config, customRoles, scopes) {
410
- return {
411
- dialect: config.rls?.dialect ?? "supabase",
412
- gucPrefix: config.rls?.gucPrefix ?? "app",
413
- tenantClaim: config.rls?.tenantClaim ?? "tenant_id",
414
- roleClaim: config.rls?.roleClaim ?? "user_role",
415
- customRoles,
416
- scopes
417
- };
418
- }
419
- /** The settings that bind a fixture's subject: the GUCs, or the Supabase JWT claims. */
420
- function subjectSettings(fixture, subject) {
421
- const roles = fixture.subject.roles ?? [];
422
- const memberships = membershipsClaim(fixture.subject.memberships ?? [], subject.customRoles, subject.scopes);
423
- if (subject.dialect === "guc") {
424
- const settings = [
425
- [`${subject.gucPrefix}.user_id`, fixture.subject.id],
426
- [`${subject.gucPrefix}.${subject.roleClaim}`, roles.join(",")],
427
- [`${subject.gucPrefix}.memberships`, JSON.stringify(memberships)]
428
- ];
429
- if (fixture.subject.tenant !== void 0) settings.push([`${subject.gucPrefix}.${subject.tenantClaim}`, fixture.subject.tenant]);
430
- return settings;
431
- }
432
- const claims = {
433
- ...fixture.subject.claims,
434
- sub: fixture.subject.id,
435
- role: "authenticated",
436
- [subject.roleClaim]: roles.length === 1 ? roles[0] : roles,
437
- [subject.tenantClaim]: fixture.subject.tenant,
438
- memberships
439
- };
440
- return [["request.jwt.claims", JSON.stringify(claims)]];
441
- }
442
- /** The `custom_role_*` rows for the fixtures' custom roles; existing rows are kept. */
443
- function customRoleRows(schema, customRoles, scopes) {
444
- const table = (name) => `${quoteIdent(schema)}.${quoteIdent(name)}`;
445
- const rows = [];
446
- for (const role of customRoles) {
447
- const at = customRoleAt(role, scopes);
448
- if (at.scope === void 0) continue;
449
- for (const grant of role.grants ?? []) rows.push({
450
- sql: grant.level === void 0 ? `insert into ${table("custom_role_permissions")} (tenant_id, scope, scope_id, role, permission, effect) values ($1, $2, $3, $4, $5, $6) on conflict do nothing` : `insert into ${table("custom_role_permissions")} (tenant_id, scope, scope_id, role, permission, effect, level) values ($1, $2, $3, $4, $5, $6, $7) on conflict do nothing`,
451
- values: [
452
- role.tenant ?? null,
453
- at.scope,
454
- at.id ?? null,
455
- role.name,
456
- grant.permission,
457
- grant.effect ?? "allow",
458
- ...grant.level === void 0 ? [] : [grant.level]
459
- ]
460
- });
461
- for (const name of role.includes ?? []) rows.push({
462
- sql: `insert into ${table("custom_role_includes")} (tenant_id, scope, scope_id, role, include_role) values ($1, $2, $3, $4, $5) on conflict do nothing`,
463
- values: [
464
- role.tenant ?? null,
465
- at.scope,
466
- at.id ?? null,
467
- role.name,
468
- name
469
- ]
470
- });
471
- }
472
- return rows;
473
- }
474
- function seedsCustomRoleTables(config) {
475
- const rls = config.rls;
476
- return rls?.customRoles === true && (rls.authorize ?? rls.rbac?.authorize ?? "jwt") === "database";
477
- }
478
- function customRoleSchema(config) {
479
- return config.rls?.schema ?? config.rls?.rbac?.schema ?? "permdock";
480
- }
481
- /**
482
- * A pgTAP script that runs each fixture's statement under the fixture's
483
- * subject and asserts the outcome `can()` gave in-process.
484
- */
485
- function emitPgtap(input) {
486
- const scopes = scopeList(input.policy.scopes);
487
- const subject = subjectOf(input.config, input.customRoles, scopes);
488
- const lines = [
489
- "begin;",
490
- `select plan(${String(input.fixtures.length)});`,
491
- PGTAP_DECISION_SQL
492
- ];
493
- if (seedsCustomRoleTables(input.config)) for (const row of customRoleRows(customRoleSchema(input.config), input.customRoles, scopes)) lines.push(`${inlineStatement(row)};`);
494
- for (const [index, fixture] of input.fixtures.entries()) {
495
- const permission = findPermission(input.policy.permissions, fixture.action);
496
- const status = input.inProcess[index];
497
- const label = `fixture ${String(index)} ${fixture.action}`;
498
- if (permission === void 0 || status === void 0) continue;
499
- if (status.kind === "opaque") {
500
- lines.push(`select skip(${quoteLiteral(`${label}: opaque grant untestable app-side`)}, 1);`);
501
- continue;
502
- }
503
- const outcome = status.granted ? "granted" : "denied";
504
- const table = input.config.rls?.tables?.[permission.resource] ?? permission.resource;
505
- const statement = inlineStatement(statementFor(fixture, permission.action, table));
506
- lines.push(`-- ${label}`, "savepoint permdock_fixture;", "set local role \"authenticated\";", ...subjectSettings(fixture, subject).map(([name, value]) => `select set_config(${quoteLiteral(name)}, ${quoteLiteral(value)}, true);`), `select is(${PGTAP_DECISION}(${quoteLiteral(statement)}), ${quoteLiteral(outcome)}, ${quoteLiteral(`${label} ${outcome}`)});`, "rollback to savepoint permdock_fixture;");
507
- }
508
- lines.push("select * from finish();", "rollback;");
509
- return `${lines.join("\n")}\n`;
510
- }
511
- /** Columns of `row` that hold a value; a masked column reads as null. */
512
- function valuedColumns(row) {
513
- return isRecord(row) ? Object.keys(row).filter((name) => row[name] !== null && row[name] !== void 0).toSorted() : [];
514
- }
515
- /**
516
- * What a field view returns for a row: nothing for a denied row, otherwise
517
- * `pick`'s columns with a value plus the key, which always passes through.
518
- */
519
- function expectedFields(granted, picked, key, row) {
520
- if (!granted) return [];
521
- const kept = new Set(valuedColumns(picked));
522
- if (isRecord(row) && row[key] !== null && row[key] !== void 0) kept.add(key);
523
- return [...kept].toSorted();
524
- }
525
- function fieldsMismatch(fixture, want, seen) {
526
- const kept = want.join(", ");
527
- if (typeof seen === "string") return [`${fixture.action}: field view read failed (${seen}), pick keeps [${kept}]`];
528
- return seen.join(", ") === kept ? [] : [`${fixture.action} ${String(rowId(fixture.row))}: field view returns [${seen.join(", ")}], pick keeps [${kept}]`];
529
- }
530
- /** The field view's columns for the fixture's row: the view, or the table itself when no grant limits its fields. */
531
- async function viewFields(query, table, key) {
532
- const view = quoteTable(viewName(table, FIELD_VIEWS.view));
533
- const id = quoteIdent("id");
534
- await query("savepoint permdock_fields");
535
- const result = await query(`select * from ${view} where ${id} = $1`, [key]);
536
- if (result.code === void 0) return valuedColumns(result.rows[0]);
537
- await query("rollback to savepoint permdock_fields");
538
- if (result.code !== "42P01") return result.code;
539
- const base = await query(`select * from ${quoteTable(table)} where ${id} = $1`, [key]);
540
- return base.code ?? valuedColumns(base.rows[0]);
541
- }
542
- /** Writes the custom roles into the `database`-mode tables; the fixture transaction rolls them back. */
543
- async function seedCustomRoles(query, schema, customRoles, scopes) {
544
- for (const row of customRoleRows(schema, customRoles, scopes)) {
545
- const result = await query(row.sql, row.values);
546
- if (result.code !== void 0) throw new Error(`PermDock CLI: rls verify --db could not seed custom roles (${result.code}); connect as a role that owns the custom_role_* tables`);
547
- }
548
- }
549
- async function bindSubject(query, fixture, subject) {
550
- await query("set local role \"authenticated\"");
551
- for (const [name, value] of subjectSettings(fixture, subject)) await query("select set_config($1, $2, true)", [name, value]);
552
- }
553
- async function verifyAgainstDatabase(input) {
554
- const client = await input.connect(input.db);
555
- const seedsTables = seedsCustomRoleTables(input.config);
556
- const schema = customRoleSchema(input.config);
557
- const scopes = scopeList(input.policy.scopes);
558
- const subject = subjectOf(input.config, input.customRoles, scopes);
559
- const query = async (sql, values) => {
560
- try {
561
- const result = await client.query(sql, values === void 0 ? [] : [...values]);
562
- return {
563
- rows: result.rows,
564
- rowCount: result.rowCount ?? result.rows.length
565
- };
566
- } catch (cause) {
567
- const code = cause !== null && typeof cause === "object" && "code" in cause && typeof cause.code === "string" ? cause.code : void 0;
568
- return {
569
- rows: [],
570
- rowCount: 0,
571
- ...code === void 0 ? {} : { code }
572
- };
573
- }
574
- };
575
- const mismatches = [];
576
- const notes = [];
577
- try {
578
- const conditioned = policyRowConditionKeys(input.policy);
579
- for (const found of helperTablePoliciesFromRows((await query(HELPER_TABLE_POLICIES_SQL)).rows)) {
580
- const keys = found.keys.filter((key) => conditioned.has(key));
581
- if (keys.length > 0) mismatches.push(`PD037 ${rowConditionMessage(found, keys)}`);
582
- }
583
- for (const [index, fixture] of input.fixtures.entries()) {
584
- const permission = findPermission(input.policy.permissions, fixture.action);
585
- const status = input.inProcess[index];
586
- if (permission === void 0 || status === void 0) continue;
587
- if (status.kind === "opaque") {
588
- notes.push(`${fixture.action}: opaque grant untestable app-side`);
589
- continue;
590
- }
591
- const table = input.config.rls?.tables?.[permission.resource] ?? permission.resource;
592
- await query("begin");
593
- try {
594
- if (seedsTables) await seedCustomRoles(query, schema, input.customRoles, scopes);
595
- await bindSubject(query, fixture, subject);
596
- const statement = statementFor(fixture, permission.action, table);
597
- const result = await query(statement.sql, statement.values);
598
- const count = result.rowCount ?? result.rows.length;
599
- const database = result.code === "42501" ? "rejected" : count > 0 ? "allowed" : "filtered";
600
- if (!(status.granted ? database === "allowed" : database === "filtered" || database === "rejected")) mismatches.push(`${fixture.action}: in-process ${status.granted ? "granted" : "denied"}, database ${database}`);
601
- else if (status.kind === "sqlFunction") notes.push(`${fixture.action}: verified through twin`);
602
- mismatches.push(...status.fields === void 0 ? [] : fieldsMismatch(fixture, status.fields, await viewFields(query, table, rowId(fixture.row))));
603
- } finally {
604
- await query("rollback");
605
- }
606
- }
607
- } finally {
608
- await client.end();
609
- }
610
- return {
611
- mismatches,
612
- notes
613
- };
614
- }
615
- /** `--tree`: seeds a generated object graph in a rolled-back transaction and compares `can()` with RLS. */
616
- async function verifyTreeAgainstDatabase(db, policy, config, connect) {
617
- const client = await connect(db);
618
- const scopes = scopeList(policy.scopes);
619
- const query = async (sql, values) => {
620
- return { rows: (await client.query(sql, values === void 0 ? [] : [...values])).rows };
621
- };
622
- const loose = async (sql, values) => {
623
- await query(sql, values);
624
- return { rows: [] };
625
- };
626
- try {
627
- await query("begin");
628
- const result = await verifyTree({
629
- policy,
630
- config,
631
- query,
632
- bind: (subject) => bindSubject(loose, {
633
- subject: { id: subject },
634
- row: {},
635
- action: "read"
636
- }, subjectOf(config, [], scopes))
637
- });
638
- if (result.mismatches.length > 0) return {
639
- code: 1,
640
- output: [...result.mismatches, ...result.notes].join("\n")
641
- };
642
- const verified = `verified ${String(result.checked)} tree check(s) against the database (${String(result.granted)} granted)`;
643
- return {
644
- code: 0,
645
- output: result.notes.length === 0 ? verified : `${verified}\n${result.notes.join("\n")}`
646
- };
647
- } catch (cause) {
648
- return {
649
- code: 2,
650
- output: `PermDock CLI: rls verify --tree could not seed the tree (${describeError(cause)}); connect as a role that owns the tables and is a member of authenticated`
651
- };
652
- } finally {
653
- await client.query("rollback", []).catch(() => void 0);
654
- await client.end();
655
- }
656
- }
657
- async function runRlsVerify(input) {
658
- const connect = input.connect ?? ((db) => connectPg(db, "permdock rls verify --db"));
659
- const policyPath = input.from ?? input.config.policy;
660
- if (policyPath === void 0) return {
661
- code: 2,
662
- output: "PermDock CLI: rls verify needs policy in the config or --from"
663
- };
664
- const policy = asPolicy(pickNamed(await loadModule(resolve(input.cwd, policyPath)), ["policy"]));
665
- if (input.tree === true) {
666
- if (input.db === void 0) return {
667
- code: 2,
668
- output: "PermDock CLI: rls verify --tree needs --db"
669
- };
670
- try {
671
- return await verifyTreeAgainstDatabase(input.db, policy, input.config, connect);
672
- } catch (cause) {
673
- return usageResult(cause);
674
- }
675
- }
676
- const fixturesPath = input.fixtures ?? input.config.rls?.fixtures ?? "rls.fixtures.json";
677
- const { fixtures, customRoles } = await loadFixtures(input.cwd, fixturesPath);
678
- const mismatches = [];
679
- const notes = [];
680
- const inProcess = [];
681
- const fieldsMode = input.config.rls?.fields === "views";
682
- for (const fixture of fixtures) {
683
- const permission = findPermission(policy.permissions, fixture.action);
684
- if (permission === void 0) {
685
- mismatches.push(`${fixture.action}: unknown permission`);
686
- inProcess.push({
687
- action: fixture.action,
688
- granted: false,
689
- kind: "portable"
690
- });
691
- continue;
692
- }
693
- const kind = grantKind(policy, fixture.action);
694
- const permdock = await createPermDock(policy, fixtureSubject(fixture.subject), { customRoles: memoryRoleSource(customRoles) });
695
- const granted = canFixture(permdock, permission, fixtureRow(fixture, permission.kind));
696
- const outcome = granted ? "granted" : "denied";
697
- if (fixture.expected !== void 0 && fixture.expected !== outcome) mismatches.push(`${fixture.action}: in-process ${outcome}, expected ${fixture.expected}`);
698
- if (kind === "opaque") notes.push(`${fixture.action}: opaque grant untestable app-side`);
699
- const fields = fieldsMode && permission.kind === "instance" && commandFor(permission.action, input.config.rls?.actions) === "select" ? expectedFields(granted, permdock.pick(permission, fixture.row), policy.resources.get(permission.resource)?.id ?? "id", fixture.row) : void 0;
700
- inProcess.push({
701
- action: fixture.action,
702
- granted,
703
- kind,
704
- ...fields === void 0 ? {} : { fields }
705
- });
706
- }
707
- if (input.format === "pgtap") return mismatches.length > 0 ? {
708
- code: 1,
709
- output: mismatches.join("\n")
710
- } : {
711
- code: 0,
712
- output: emitPgtap({
713
- fixtures,
714
- inProcess,
715
- policy,
716
- config: input.config,
717
- customRoles
718
- })
719
- };
720
- if (input.db !== void 0) try {
721
- const database = await verifyAgainstDatabase({
722
- db: input.db,
723
- policy,
724
- fixtures,
725
- customRoles,
726
- config: input.config,
727
- inProcess,
728
- connect
729
- });
730
- mismatches.push(...database.mismatches);
731
- notes.push(...database.notes);
732
- } catch (cause) {
733
- return usageResult(cause);
734
- }
735
- if (mismatches.length > 0) return {
736
- code: 1,
737
- output: [...mismatches, ...notes].join("\n")
738
- };
739
- const verified = `verified ${String(fixtures.length)} fixture(s) ${input.db === void 0 ? "in-process" : "in-process and against the database"}`;
740
- return {
741
- code: 0,
742
- output: notes.length === 0 ? verified : `${verified}\n${notes.join("\n")}`
743
- };
744
- }
745
- //#endregion
746
- export { runRlsVerify as n, canFixture as t };