permdock 0.5.0 → 0.7.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 (399) hide show
  1. package/README.md +1 -0
  2. package/dist/{2020-C9VN-x8c.js → 2020-CJbO8Bvz.js} +1 -3
  3. package/dist/a2a/index.d.ts +5 -5
  4. package/dist/a2a/index.js +4 -4
  5. package/dist/{adoption-scan-B4R5fnMU.js → adoption-scan-D-feE7BE.js} +1 -1
  6. package/dist/agent/index.d.ts +3 -3
  7. package/dist/agent/index.js +1 -1
  8. package/dist/ai-sdk/index.d.ts +21 -6
  9. package/dist/ai-sdk/index.js +19 -9
  10. package/dist/{approval-prompt-Djo_PyZc.d.ts → approval-prompt-K0faOLFp.d.ts} +2 -2
  11. package/dist/approvals/index.d.ts +4 -4
  12. package/dist/approvals/index.js +4 -4
  13. package/dist/{approvals-DJ6Yd5z1.js → approvals-CMRfsbBh.js} +74 -48
  14. package/dist/{arazzo-B6lebmiQ.js → arazzo-ClrF3PVb.js} +2 -2
  15. package/dist/{arazzo-BWhNF-k0.js → arazzo-rdeJ8n1J.js} +4 -4
  16. package/dist/{args-IIolxxKA.js → args-CC3OwyHW.js} +112 -2
  17. package/dist/astro/index.d.ts +6 -6
  18. package/dist/astro/index.js +2 -2
  19. package/dist/{audience-Dg8XsRaO.js → audience-BrMs8c4o.js} +1 -1
  20. package/dist/{auth-DRLEizbL.js → auth-CscUX8Sy.js} +3 -4
  21. package/dist/authzen/index.d.ts +162 -22
  22. package/dist/authzen/index.js +315 -146
  23. package/dist/{automation-BMZPIVUM.d.ts → automation-DOtAFWdy.d.ts} +3 -3
  24. package/dist/{automation-DVjOckjV.js → automation-ySsxp_Yp.js} +1 -1
  25. package/dist/base-url-BQbddZO5.js +9 -0
  26. package/dist/better-auth/index.d.ts +2 -2
  27. package/dist/better-auth/index.js +2 -2
  28. package/dist/better-supabase/index.d.ts +50 -8
  29. package/dist/better-supabase/index.js +94 -32
  30. package/dist/{bind-CZzhx-Vj.js → bind-D1nO6fiC.js} +5 -5
  31. package/dist/{bind--9EFVYWF.d.ts → bind-JDuvxjuW.d.ts} +7 -7
  32. package/dist/{build-instance-BMnAudHn.js → build-instance-DxE7czo9.js} +1 -1
  33. package/dist/{canonical-json-BC8_nMTw.js → canonical-json-DwilZ1iB.js} +6 -3
  34. package/dist/{capability-BSslw1QV.d.ts → capability-D4UC9TTW.d.ts} +2 -2
  35. package/dist/{capability-N1K9IpqS.js → capability-L7NnfhiE.js} +1 -1
  36. package/dist/{casbin-Cr7RLtA3.js → casbin-BHijLuHY.js} +2 -2
  37. package/dist/{casbin-Dyu2gnUD.js → casbin-BW9pS47J.js} +1 -1
  38. package/dist/{casl-64gpT-8x.js → casl-CmJlgziS.js} +2 -2
  39. package/dist/{casl-DjEDhTCP.js → casl-UbI8v-Wq.js} +1 -1
  40. package/dist/catalog/index.d.ts +70 -10
  41. package/dist/catalog/index.js +112 -6
  42. package/dist/catalog-BCCjSAdH.js +1 -0
  43. package/dist/{catalog-R_A__RsH.js → catalog-BaMQfQ6Y.js} +3 -3
  44. package/dist/{catalog-BECMPrwc.js → catalog-D69WhFii.js} +43 -13
  45. package/dist/{catalog-doc-C9wjsfNY.js → catalog-doc-CV9s6B1S.js} +28 -5
  46. package/dist/{catalog-fingerprint-CCP0-yQS.js → catalog-fingerprint-C144oW4M.js} +1 -1
  47. package/dist/{create-BWRSXgOF.js → challenge-nGWma08S.js} +122 -25
  48. package/dist/chat/index.d.ts +1 -1
  49. package/dist/chat/index.js +2 -2
  50. package/dist/chat-sdk/index.d.ts +3 -3
  51. package/dist/checks-BC_0mPIq.js +37 -0
  52. package/dist/claude-agent/index.d.ts +3 -3
  53. package/dist/claude-agent/index.js +2 -2
  54. package/dist/clerk/index.d.ts +3 -3
  55. package/dist/clerk/index.js +1 -1
  56. package/dist/cli/bin.js +2 -2
  57. package/dist/cli/index.d.ts +3 -3
  58. package/dist/cli/index.js +3 -3
  59. package/dist/cloud/index.d.ts +127 -11
  60. package/dist/cloud/index.js +251 -3
  61. package/dist/{cloud-CIoHNevm.js → cloud-CO8pYtwr.js} +5 -5
  62. package/dist/{codemod-Cxvvc70T.js → codemod-BP6n8N9L.js} +3 -3
  63. package/dist/{codemod-Bmj9dWMH.js → codemod-i4N2BhDc.js} +3 -3
  64. package/dist/{collect-CrZJJnEF.js → collect-BaWeMjwV.js} +17 -8
  65. package/dist/{collect-DloHbDVa.js → collect-DNm3oKOk.js} +6 -5
  66. package/dist/collect-k_Dulxr5.js +1 -0
  67. package/dist/compile/index.d.ts +1 -1
  68. package/dist/compile/index.js +1 -1
  69. package/dist/{compile-CMqMx_IN.js → compile-BAEO5bOk.js} +2 -2
  70. package/dist/{compile-Ckm2HqBZ.d.ts → compile-COM2VKuN.d.ts} +3 -3
  71. package/dist/{completion-BqhRBJD8.js → completion-BNdVf7X2.js} +3 -3
  72. package/dist/{config-bs_kZeYq.js → config-CoQHDrDi.js} +7 -3
  73. package/dist/{config-B46rm9sc.js → config-DGZzMV1B.js} +2 -2
  74. package/dist/{config-report-DUgj62Ai.js → config-report-Cm7UITNA.js} +3 -3
  75. package/dist/connector-schema-_VCSsdtD.js +433 -0
  76. package/dist/{context-bbFHR-0D.js → context--uM9V3Ui.js} +2 -2
  77. package/dist/convex/index.d.ts +5 -5
  78. package/dist/convex/index.js +2 -2
  79. package/dist/core-B5-w6Kw9.js +335 -0
  80. package/dist/core-CQkE8Esr.d.ts +179 -0
  81. package/dist/{create-0VZ7Pdiu.d.ts → create-B2-CQqCI.d.ts} +5 -5
  82. package/dist/{create-C3b4B5eF.js → create-Cb86Z8Im.js} +9 -8
  83. package/dist/{create-DnrmLnLW.js → create-DJrlhEp9.js} +5 -5
  84. package/dist/{create-BFfm17UA.d.ts → create-QHuuPw3q.d.ts} +7 -7
  85. package/dist/{create-BDS7wc3y.d.ts → create-UTnUVETj.d.ts} +30 -10
  86. package/dist/{credential-DM2um3ha.js → credential-CIM7wHwA.js} +4 -4
  87. package/dist/{credentials-DPyHmYz5.js → credentials-BpuTwd7a.js} +1 -1
  88. package/dist/{deciding-columns-Sq12mEA6.js → deciding-columns-DRo2QM6E.js} +13 -2
  89. package/dist/{delegation-DaXVdDhM.js → delegation-C5rOdTp5.js} +5 -5
  90. package/dist/delivery/index.d.ts +5 -5
  91. package/dist/delivery/index.js +4 -3
  92. package/dist/{delivery-DCAgNyCn.js → delivery-rwOKLWRm.js} +51 -2
  93. package/dist/{denied-text-D8jDHgsl.d.ts → denied-text-D4qkEtFz.d.ts} +2 -2
  94. package/dist/{describe-BybMRY7A.js → describe-DZlnEtLy.js} +1 -0
  95. package/dist/{describe-BZUsixiL.d.ts → describe-O0SwYIK8.d.ts} +2 -2
  96. package/dist/{diff-CxZo9pTq.js → diff-Btr1c1Ow.js} +2 -2
  97. package/dist/{diff-DCePiN6M.js → diff-DzT-xD13.js} +10 -10
  98. package/dist/{doctor-DFjUxf2f.js → doctor-BU1szn63.js} +241 -49
  99. package/dist/{doctor-CxiwSfqH.js → doctor-BoK_y0KO.js} +4 -4
  100. package/dist/drizzle/index.d.ts +3 -3
  101. package/dist/drizzle/index.js +1 -1
  102. package/dist/elysia/index.d.ts +5 -5
  103. package/dist/elysia/index.js +3 -3
  104. package/dist/{errors-C2PXIv4c.d.ts → errors-B_Qg9D3e.d.ts} +2 -2
  105. package/dist/{errors-CWTY6uih.js → errors-DpP_U6Bf.js} +1 -0
  106. package/dist/{evaluate-_R8QkWaf.js → evaluate-B_oqFbWC.js} +130 -34
  107. package/dist/{evaluations-16UqqQ6W.d.ts → evaluations-BCddEOfO.d.ts} +4 -4
  108. package/dist/{evaluations-DZ2CbV5k.js → evaluations-DReoiVBw.js} +4 -4
  109. package/dist/eve/index.d.ts +5 -5
  110. package/dist/eve/index.js +3 -3
  111. package/dist/express/index.d.ts +5 -5
  112. package/dist/express/index.js +3 -3
  113. package/dist/fastify/index.d.ts +5 -5
  114. package/dist/fastify/index.js +3 -3
  115. package/dist/{fetch-adapter-qKJBuRqy.d.ts → fetch-adapter-CuhyYwC1.d.ts} +4 -4
  116. package/dist/{fetch-adapter-g0ypLkID.js → fetch-adapter-De-u6vhJ.js} +3 -3
  117. package/dist/{fields-D9tPVUUS.js → fields-ClcQLrVc.js} +48 -13
  118. package/dist/{files-C5ZI27eV.js → files-acUbNwWt.js} +15 -2
  119. package/dist/{fixtures-B7XrLeY7.js → fixtures-BTMW6zgU.js} +2 -2
  120. package/dist/{flags-C3DktBDY.js → flags-aaeRAdiD.js} +2 -2
  121. package/dist/{from-snapshot-D2lZt4Dd.js → from-snapshot-Bz469dIh.js} +17 -10
  122. package/dist/generate-3FNO5P5Q.js +159 -0
  123. package/dist/{grantee-Cn1HyUsI.js → grantee-BrRANrpT.js} +14 -4
  124. package/dist/{grantee-conditions-CcXf8hMM.js → grantee-conditions-C6P1Tvol.js} +1 -1
  125. package/dist/{grantee-match-DHArqY82.js → grantee-match-0RtHWQDx.js} +3 -3
  126. package/dist/h3/index.d.ts +4 -4
  127. package/dist/h3/index.js +3 -3
  128. package/dist/{helpers-DTcZOzhF.js → helpers-DY3vXuGs.js} +3 -3
  129. package/dist/hono/index.d.ts +5 -5
  130. package/dist/hono/index.js +3 -3
  131. package/dist/{hosted-DBDX0M-P.d.ts → hosted-BmjzxQhp.d.ts} +14 -2
  132. package/dist/{hosted-BZIAYvon.js → hosted-XBgU6RGT.js} +34 -12
  133. package/dist/{http-DXJ37RDA.js → http-Ca3Sr5x1.js} +1 -1
  134. package/dist/{import-DMmOG27O.js → import-Bz0GefWg.js} +5 -5
  135. package/dist/{import-CNV7I2Dw.js → import-DB2EG_iy.js} +3 -3
  136. package/dist/{index-CxGUswIC.d.ts → index-BE8y3moU.d.ts} +50 -8
  137. package/dist/{index-Chrs5fQ-.d.ts → index-BSfRl0hZ.d.ts} +6 -6
  138. package/dist/{index-DOVf7RJv.d.ts → index-BTkwrK7v.d.ts} +155 -17
  139. package/dist/index-CMiPH2Tv.d.ts +206 -0
  140. package/dist/{index-SGdIQyzc.d.ts → index-DH9DUDEM.d.ts} +18 -3
  141. package/dist/{index-BcHcPyIo.d.ts → index-DLwcuCN_.d.ts} +86 -7
  142. package/dist/index.d.ts +18 -17
  143. package/dist/index.js +27 -25
  144. package/dist/{init-GG6Jh8HD.js → init-5TXNji88.js} +5 -5
  145. package/dist/{init-DeMYsnYJ.js → init-B-4t1NzC.js} +4 -4
  146. package/dist/{instance-options-Omfd793B.d.ts → instance-options-CU0YQCLH.d.ts} +1 -1
  147. package/dist/{instance-snapshot-Cxq4ygFc.js → instance-snapshot-CjcwnEiV.js} +20 -14
  148. package/dist/jwt/index.d.ts +83 -5
  149. package/dist/jwt/index.js +143 -5
  150. package/dist/{kernel-5JatXyND.js → kernel-DVExUwkp.js} +138 -12
  151. package/dist/kysely/index.d.ts +3 -3
  152. package/dist/kysely/index.js +1 -1
  153. package/dist/load-DrMHXzgN.js +1 -0
  154. package/dist/{load-DFS_ry0W.js → load-DxroEzH1.js} +2 -2
  155. package/dist/{login-Dfe5RlYk.js → login-ClSJh5t5.js} +4 -4
  156. package/dist/{login-imhuwvn3.js → login-WC9HPJpU.js} +6 -10
  157. package/dist/{manifest-C8IzW3Do.js → manifest-B79YuF2T.js} +6 -2
  158. package/dist/{manifest-mx5ghSFM.d.ts → manifest-BVhExYhw.d.ts} +23 -2
  159. package/dist/{manifest-CtKR3GXL.js → manifest-Dv6q4i5s.js} +54 -35
  160. package/dist/{manifest-schema-C0kK_8V0.js → manifest-schema-Cv492Qev.js} +37 -7
  161. package/dist/{map-claims-D3oRmTk0.js → map-claims-etGIS_Dv.js} +14 -11
  162. package/dist/{map-error-TCAdw-eW.js → map-error-BQGyDm_M.js} +1 -1
  163. package/dist/mcp/index.d.ts +64 -10
  164. package/dist/mcp/index.js +151 -22
  165. package/dist/{migrate-BShP7Vf4.js → migrate-Dodel0IJ.js} +77 -24
  166. package/dist/nest/index.d.ts +5 -5
  167. package/dist/nest/index.js +3 -3
  168. package/dist/next/index.d.ts +9 -9
  169. package/dist/next/index.js +5 -5
  170. package/dist/next/plugin.d.ts +1 -1
  171. package/dist/next/plugin.js +2 -2
  172. package/dist/node/index.d.ts +5 -5
  173. package/dist/node/index.js +2 -2
  174. package/dist/openai/index.d.ts +5 -5
  175. package/dist/openai/index.js +3 -3
  176. package/dist/openapi/index.d.ts +14 -4
  177. package/dist/openapi/index.js +1 -1
  178. package/dist/{openapi-ahr8rHu3.js → openapi-DMocl1bh.js} +4 -4
  179. package/dist/{openapi-B7HZ0f-r.js → openapi-Ddb4628T.js} +2 -7
  180. package/dist/{openapi-DTaEmTSW.js → openapi-ztVaux6j.js} +8 -8
  181. package/dist/{operation-findings-DgATDpvh.js → operation-findings-kRcEp8lE.js} +1 -1
  182. package/dist/{operations-CxybZErY.d.ts → operations-BNLes61x.d.ts} +1 -1
  183. package/dist/orpc/index.d.ts +6 -6
  184. package/dist/orpc/index.js +4 -4
  185. package/dist/otel/index.d.ts +3 -3
  186. package/dist/otel/index.js +1 -1
  187. package/dist/{output-Dyw8fyPF.js → output-DgSDLrta.js} +7 -3
  188. package/dist/{output-files-DhRBBE4n.js → output-files-CCMdcFWb.js} +2 -2
  189. package/dist/output-files-DPAY7-GX.js +1 -0
  190. package/dist/{ownership-BatFgAA4.js → ownership-Z2LpxsGa.js} +1349 -883
  191. package/dist/parse-Ddhz2xf4.js +148 -0
  192. package/dist/{parse-local-manifest-CVSs6J9I.js → parse-local-manifest-T1Q8X3A2.js} +24 -1
  193. package/dist/{parse-local-manifest-DgqtruPn.d.ts → parse-local-manifest-e4mdwAKd.d.ts} +1 -1
  194. package/dist/pdp/index.d.ts +3 -3
  195. package/dist/pdp/index.js +7 -3
  196. package/dist/peer-12Q5I_RH.js +976 -0
  197. package/dist/{peer-CRvC7Hg1.js → peer-DOzzMfZL.js} +1 -1
  198. package/dist/{permdock-B9JxkBwC.js → permdock-BfWEeMqk.js} +177 -49
  199. package/dist/{permdock-D7eeLJER.d.ts → permdock-Dco6dyCK.d.ts} +34 -5
  200. package/dist/{permission-registry-Br4jSNVi.js → permission-registry-DpPtSKNZ.js} +1 -1
  201. package/dist/{vocabulary-D6lPdb4Z.d.ts → permission-types-DhNEmoRG.d.ts} +4 -62
  202. package/dist/{permissions-oEWfl-kl.d.ts → permissions-CoqCOfJ3.d.ts} +2 -1
  203. package/dist/{permissions-B-wCP5ZC.js → permissions-CyH2MV_B.js} +1 -1
  204. package/dist/{permissions-CZKiUfFM.js → permissions-DArULThq.js} +4 -4
  205. package/dist/pkce-5h8NgMQJ.js +21 -0
  206. package/dist/{policies-CO1oOymN.js → policies-B2lZIurj.js} +3 -3
  207. package/dist/{policy-Czo4n3Hs.d.ts → policy-B7dg_yzu.d.ts} +2 -2
  208. package/dist/{policy-DLZJ5gAp.js → policy-DaJy4nK4.js} +17 -8
  209. package/dist/{policy-from-catalog-DzhEc3Y9.js → policy-from-catalog-DFWYkNdu.js} +9 -9
  210. package/dist/{policy-types-DzwivBgR.d.ts → policy-types-B-F-qAZk.d.ts} +109 -5
  211. package/dist/postgres-store-BL9M_CA1.js +1001 -0
  212. package/dist/{postgrest-NUqZT-RB.d.ts → postgrest-CYacM_u7.d.ts} +12 -1
  213. package/dist/{postgrest-CW0IqC-U.js → postgrest-r5faDIzD.js} +47 -5
  214. package/dist/{powersync-BHfuehf3.js → powersync-13odBwiM.js} +3 -3
  215. package/dist/powersync-53ryOZip.js +1059 -0
  216. package/dist/powersync-CExtTLyA.js +1 -0
  217. package/dist/preset/index.js +1 -1
  218. package/dist/{preset-DZdU0tne.js → preset-CHTbd-DQ.js} +2 -2
  219. package/dist/prisma/index.d.ts +2 -2
  220. package/dist/prisma/index.js +1 -1
  221. package/dist/{problem-details-DXlt-vks.d.ts → problem-details-Tcfmj3bV.d.ts} +1 -1
  222. package/dist/prompt-DwtVemER.js +935 -0
  223. package/dist/{protected-DEPHc2xV.d.ts → protected-BwZYL1X_.d.ts} +6 -5
  224. package/dist/{protected-DfjY5mLA.js → protected-DXE3cQYg.js} +2 -2
  225. package/dist/{provider-CC-u3bYP.js → provider-BQsTYYy0.js} +2 -2
  226. package/dist/{provider-DMVt6yYn.d.ts → provider-Csk-THAn.d.ts} +1 -1
  227. package/dist/{provider-store-B5Yrkhzr.js → provider-store-IgqQipCO.js} +2 -2
  228. package/dist/{pull-BgIfno6w.js → pull-CN5OLxrF.js} +7 -7
  229. package/dist/pull-Cty6Ovyu.js +1 -0
  230. package/dist/{push-CmFVBOeI.js → push-tVdG8dUL.js} +54 -14
  231. package/dist/{pushed-policy-BImMTTIM.d.ts → pushed-policy-BbcY9r_4.d.ts} +1 -1
  232. package/dist/{pushed-policy-DobP7AHI.js → pushed-policy-CmYeSQqq.js} +1 -1
  233. package/dist/react/index.d.ts +6 -6
  234. package/dist/react/index.js +3 -3
  235. package/dist/react/provider-client.d.ts +1 -1
  236. package/dist/react/provider-client.js +1 -1
  237. package/dist/react-native/index.d.ts +25 -11
  238. package/dist/react-native/index.js +214 -24
  239. package/dist/{refs-K6eWUJ0H.js → refs-CNJBiTFo.js} +15 -1
  240. package/dist/{replay-D7iKcLFe.d.ts → replay-DCDD_ZfL.d.ts} +1 -1
  241. package/dist/{request-context-BTRTG7OT.js → request-context-BykKLmyE.js} +2 -2
  242. package/dist/resend/index.d.ts +4 -4
  243. package/dist/{retire-CALjIQ7e.js → retire-Wj6dkyDE.js} +2 -2
  244. package/dist/{rls-BA8an5Ap.js → rls-Ck_PocSp.js} +32 -8
  245. package/dist/{rls-j6t43t7n.js → rls-CxBZb4rZ.js} +478 -534
  246. package/dist/{role-builder-CXbis5-X.js → role-builder-C1VJzvcr.js} +3 -3
  247. package/dist/rolldown-runtime-C3I60J0A.js +4 -0
  248. package/dist/{rpc-aPyNi6tA.js → rpc-Bk1bE-ch.js} +1 -1
  249. package/dist/run-Bz7DXGEv.js +1 -0
  250. package/dist/{run-ticket-sxFI6LAk.js → run-ticket-B5d_63Ma.js} +22 -1
  251. package/dist/{run-ticket-BjhTOi6u.d.ts → run-ticket-BpNi7BCi.d.ts} +8 -3
  252. package/dist/{run-DOfMtc9V.js → run-uLD2aWuO.js} +7 -7
  253. package/dist/{runtime-D3VTAiCA.js → runtime-Vif3_-zf.js} +1 -1
  254. package/dist/{saas-FO-Q8oj0.js → saas-Az_Kz-4D.js} +7 -7
  255. package/dist/{scan-BOI5tJ-6.js → scan-DSljDE1Y.js} +1 -1
  256. package/dist/{schema-yLuBWWsh.js → schema-gIcCx7zM.js} +1 -1
  257. package/dist/scim/index.d.ts +3 -2
  258. package/dist/scim/index.js +3 -1
  259. package/dist/scim-C7JYhySg.js +44 -0
  260. package/dist/{scim-ClHtpyV3.js → scim-YNieBO1U.js} +3 -537
  261. package/dist/{scopes-CUPSjo9q.js → scopes-BHsc-wp-.js} +1 -1
  262. package/dist/server/index.d.ts +11 -11
  263. package/dist/server/index.js +7 -7
  264. package/dist/{server-DqCT4CgZ.js → server-Bnga6I50.js} +3 -3
  265. package/dist/{server-types-BLd4MnBX.d.ts → server-types-C4gZUEZy.d.ts} +9 -9
  266. package/dist/{shared-DvvFzYXe.js → shared-C8LjUdVU.js} +1 -1
  267. package/dist/{shared-CD11nBbC.js → shared-fMKOv8hP.js} +46 -39
  268. package/dist/{sink-Bj_lDUDq.d.ts → sink-Cp_Eot9W.d.ts} +4 -4
  269. package/dist/{skills-B6lVdD_W.js → skills-Dcjw9_1C.js} +5 -5
  270. package/dist/{skills-CTYwkl44.js → skills-g_3BS9NC.js} +3 -3
  271. package/dist/{snapshot-CXUWfsNy.js → snapshot-CbGmYiJx.js} +4 -4
  272. package/dist/{snapshot-cache-DZHQ0KF6.js → snapshot-cache-DT2Kx1F8.js} +1 -1
  273. package/dist/{snapshot-cache-DqK9eDmM.d.ts → snapshot-cache-Pahd3IYJ.d.ts} +1 -1
  274. package/dist/solid/index.d.ts +6 -5
  275. package/dist/solid/index.js +4 -4
  276. package/dist/solid-start/index.d.ts +6 -6
  277. package/dist/solid-start/index.js +3 -3
  278. package/dist/{sources-vs5dGOsS.js → sources-B-zYB4GS.js} +111 -25
  279. package/dist/{sources-BV9j0DeZ.d.ts → sources-DEEuGb8S.d.ts} +63 -14
  280. package/dist/sources-qoIJQrJv.js +11 -0
  281. package/dist/{sql-B5T1IL83.js → sql-B96movIM.js} +5 -1
  282. package/dist/sql-CDEPCA0g.d.ts +10 -0
  283. package/dist/{src-DLfUWFAI.js → src-DLFrtrrC.js} +154 -53
  284. package/dist/ssf/index.d.ts +4 -4
  285. package/dist/ssf/index.js +640 -211
  286. package/dist/{standard-webhooks-6lg8v_is.d.ts → standard-webhooks-B_qRg0ws.d.ts} +2 -2
  287. package/dist/{store-4u_hxjWa.js → store-DSP9oGvh.js} +15 -7
  288. package/dist/{store-options-BqEakYRa.js → store-options-B_poyYvg.js} +6 -6
  289. package/dist/{stores-ClZUgeoP.d.ts → stores-BAZwSYZA.d.ts} +6 -5
  290. package/dist/{stores-BbsD4fAR.js → stores-BqEuHC05.js} +2 -2
  291. package/dist/{stream-7-xmnf3U.d.ts → stream-2Vwhl7Er.d.ts} +2 -2
  292. package/dist/{style-Uao76wO7.js → style-Cqo7-73x.js} +1 -0
  293. package/dist/{style-DiKWnAvn.js → style-Ds1gNm77.js} +1 -1
  294. package/dist/supabase/index.d.ts +8 -7
  295. package/dist/supabase/index.js +5 -5
  296. package/dist/supabase/middleware.d.ts +6 -6
  297. package/dist/supabase/middleware.js +6 -6
  298. package/dist/{supabase-Dxlp8A94.js → supabase--0aJdLEd.js} +9 -7
  299. package/dist/{supabase-9pqI57pW.js → supabase-Bqp7iIY2.js} +3 -3
  300. package/dist/supabase-hook-DJxC4PoP.js +1 -0
  301. package/dist/{supabase-hook-DdDQhMlw.js → supabase-hook-Dg0SrQWR.js} +1069 -123
  302. package/dist/supautils-MESd81bF.js +689 -0
  303. package/dist/{support-session-C6xJQYut.js → support-session-Cna49-3f.js} +2 -2
  304. package/dist/svelte/index.d.ts +5 -5
  305. package/dist/svelte/index.js +5 -5
  306. package/dist/svelte/runtime.d.ts +3 -3
  307. package/dist/svelte/runtime.js +3 -3
  308. package/dist/svelte/source.d.ts +5 -5
  309. package/dist/svelte/source.js +2 -2
  310. package/dist/sveltekit/index.d.ts +6 -6
  311. package/dist/sveltekit/index.js +2 -2
  312. package/dist/tanstack-start/index.d.ts +6 -6
  313. package/dist/tanstack-start/index.js +2 -2
  314. package/dist/{tenancy-DN2QAx9z.js → tenancy-CmeBQ6Nv.js} +12 -3
  315. package/dist/terminal/index.d.ts +6 -6
  316. package/dist/terminal/index.js +3 -3
  317. package/dist/testing/core.d.ts +2 -0
  318. package/dist/testing/core.js +1 -0
  319. package/dist/testing/fixtures/index.d.ts +12 -0
  320. package/dist/testing/fixtures/index.js +770 -0
  321. package/dist/testing/index.d.ts +41 -174
  322. package/dist/testing/index.js +241 -731
  323. package/dist/testing/saas/index.d.ts +5 -5
  324. package/dist/testing/saas/index.js +2 -2
  325. package/dist/testing/saas/permissions.d.ts +1 -1
  326. package/dist/testing/saas/permissions.js +1 -1
  327. package/dist/text-diff-DhITNCnD.js +444 -0
  328. package/dist/{token-BLZcjQgt.js → token-2qYDvXz2.js} +1 -1
  329. package/dist/{tool-refusal-CMLN5xhn.js → tool-refusal-reAhIzdl.js} +1 -1
  330. package/dist/trpc/index.d.ts +6 -6
  331. package/dist/trpc/index.js +3 -3
  332. package/dist/{types-5Ut_pbKy.d.ts → types-BWZybqs9.d.ts} +112 -8
  333. package/dist/{types-CZTnPFzM.d.ts → types-BXMYB7BY.d.ts} +2 -2
  334. package/dist/{types-CdlxsYQh.d.ts → types-BfVmNJO5.d.ts} +14 -3
  335. package/dist/{types-BqAKcRNW.d.ts → types-CIeZcG8v.d.ts} +2 -2
  336. package/dist/{types-BNORmDM8.d.ts → types-CKV71kKh.d.ts} +4 -4
  337. package/dist/{types-tIgIeIKJ.d.ts → types-CQVEQawv.d.ts} +4 -4
  338. package/dist/{types-BjV-fqcA.d.ts → types-CeIscIKp.d.ts} +4 -4
  339. package/dist/{types-_sHy8BQf.d.ts → types-CfiKC5aN.d.ts} +1 -1
  340. package/dist/{types-ClZaWzfb.d.ts → types-D3A19w4A.d.ts} +8 -4
  341. package/dist/{types-C8-KNsFf.d.ts → types-DBHftjgS.d.ts} +15 -8
  342. package/dist/{types-CCpc2Dcv.d.ts → types-DC44-hqb.d.ts} +2 -2
  343. package/dist/{types-fbZ7JEXr.d.ts → types-DXmwu78Z.d.ts} +4 -4
  344. package/dist/{types-DiQjupG2.d.ts → types-cTos-H7p.d.ts} +2 -2
  345. package/dist/{types-DX0LaKTb.d.ts → types-g7Oy6Zg4.d.ts} +3 -3
  346. package/dist/unplugin/index.d.ts +1 -1
  347. package/dist/unplugin/index.js +2 -2
  348. package/dist/{usage-T5mXq98v.js → usage-Bybmck7f.js} +7 -7
  349. package/dist/{usage-DHtE8j4E.js → usage-CDaLXCfL.js} +2 -2
  350. package/dist/usage-y-kBNdqs.js +1 -0
  351. package/dist/{validation-error-Bg5Tpluk.d.ts → validation-error-CQpoquwj.d.ts} +1 -1
  352. package/dist/{verify-DbCL9bnB.js → verify-pe8rL_Qw.js} +350 -83
  353. package/dist/{views-DTIIO-oQ.js → views-BB8E9dTP.js} +1 -1
  354. package/dist/vocabulary-Bg3eeT2H.d.ts +67 -0
  355. package/dist/vue/index.d.ts +6 -5
  356. package/dist/vue/index.js +4 -4
  357. package/dist/{waiter-CKy4MQSY.d.ts → waiter-DwEyouan.d.ts} +2 -2
  358. package/dist/watch-Bd9mx3rd.js +1 -0
  359. package/dist/{watch-CszoTJMq.js → watch-C-4VmFlL.js} +3 -3
  360. package/dist/webmcp/index.d.ts +2 -2
  361. package/dist/webmcp/index.js +2 -2
  362. package/dist/{where-scope-Dv-WTP-w.js → where-scope-wq2coopv.js} +41 -21
  363. package/dist/{who-can-D0QoYbEb.js → who-can-BwNsI_Js.js} +6 -6
  364. package/dist/workflow/index.d.ts +3 -3
  365. package/dist/workflow/index.js +5 -5
  366. package/dist/workflow-sdk/index.d.ts +5 -5
  367. package/dist/{wrap-Bd1Tejur.d.ts → wrap-B6R0cMRL.d.ts} +2 -2
  368. package/dist/{wrap-gX61EtpB.js → wrap-CiSc_KCq.js} +8 -2
  369. package/package.json +22 -11
  370. package/schemas/cli-result-v1.json +1 -0
  371. package/schemas/cloud-api-v1.json +152 -7
  372. package/schemas/connector-v1.json +8 -0
  373. package/schemas/supabase-claims-v1.json +5 -0
  374. package/schemas/supabase-manifest-v1.json +276 -75
  375. package/skills/permdock/SKILL.md +1 -0
  376. package/skills/permdock-agents/references/runtimes.md +3 -1
  377. package/skills/permdock-approvals/references/stores-and-resume.md +2 -1
  378. package/skills/permdock-data/references/queries-and-rls.md +5 -2
  379. package/skills/permdock-tenancy/SKILL.md +1 -1
  380. package/skills/permdock-tenancy/references/ownership-and-custom-roles.md +2 -0
  381. package/skills/permdock-wire/references/adapters.md +14 -0
  382. package/skills/permdock-wire/references/policy-options.md +1 -0
  383. package/dist/catalog-DjhMYYCq.js +0 -1
  384. package/dist/collect-FlXJlhus.js +0 -1
  385. package/dist/index-D8EovfsP.d.ts +0 -91
  386. package/dist/load-BxEtwlBS.js +0 -1
  387. package/dist/output-files-B3IZJksC.js +0 -1
  388. package/dist/parse-Cxq0WxrA.js +0 -53
  389. package/dist/peer-C8swJ2GH.js +0 -50
  390. package/dist/powersync-CbzkqL_M.js +0 -1
  391. package/dist/powersync-bYUDLOAO.js +0 -538
  392. package/dist/prompt-DfZLJLIn.js +0 -32
  393. package/dist/pull-ByOks_Tg.js +0 -1
  394. package/dist/run-CNsApDpd.js +0 -1
  395. package/dist/supabase-hook-CXcGpHqq.js +0 -1
  396. package/dist/supautils-B6HYL9eL.js +0 -91
  397. package/dist/text-diff-BQcUapOb.js +0 -15
  398. package/dist/usage-CHOtwL19.js +0 -1
  399. package/dist/watch-Cb-NcaUw.js +0 -1
@@ -1,538 +0,0 @@
1
- import { c as isConditionRef, s as isConditionDate } from "./refs-K6eWUJ0H.js";
2
- import { E as memoryCustomRoleSource, f as localSnapshotManifest } from "./src-DLfUWFAI.js";
3
- import { n as findPermission } from "./permission-registry-Br4jSNVi.js";
4
- import { d as scopeList, o as resolveScope } from "./scopes-CUPSjo9q.js";
5
- import { t as requiresApproval } from "./approval-required-TzNB9oQA.js";
6
- import { t as getPermDock } from "./permdock-B9JxkBwC.js";
7
- import { u as usageResult } from "./errors-CWTY6uih.js";
8
- import { c as requirePolicy } from "./load-DFS_ry0W.js";
9
- import { i as scopeMembershipTable, r as scopeColumn } from "./compile-CMqMx_IN.js";
10
- import { s as quoteSqlLiteral, t as SQL_IDENT } from "./sql-B5T1IL83.js";
11
- import "./sources-vs5dGOsS.js";
12
- import { t as applyFiles } from "./files-C5ZI27eV.js";
13
- import { i as fileDrift } from "./output-files-DhRBBE4n.js";
14
- import { n as fixtureSubject, r as loadFixtures, t as fixtureRow } from "./fixtures-B7XrLeY7.js";
15
- import { N as quoteIdent, a as customRolesOn, t as CUSTOM_ROLES } from "./shared-CD11nBbC.js";
16
- import { f as pgConnector } from "./policies-CO1oOymN.js";
17
- import { M as contextRefs, k as collectGrants, t as ownershipRules } from "./ownership-BatFgAA4.js";
18
- import { m as tableFor, t as canFixture } from "./verify-DbCL9bnB.js";
19
- import { resolve } from "node:path";
20
- //#region src/cli/powersync/streams.ts
21
- function ident(name) {
22
- if (!SQL_IDENT.test(name)) throw new TypeError(`PermDock CLI: '${name}' is not a plain identifier, which Sync Streams need`);
23
- return name;
24
- }
25
- const POWERSYNC = {
26
- user: "auth.user_id()",
27
- claim: (name) => `auth.parameter(${quoteSqlLiteral(name)})`,
28
- claims: (name) => `(SELECT value FROM json_each(auth.parameter(${quoteSqlLiteral(name)})))`,
29
- column: (table, name) => `${table}.${ident(name)}`,
30
- literal: (value) => typeof value === "string" ? quoteSqlLiteral(value) : String(value)
31
- };
32
- const POSTGRES = {
33
- user: "$1::text",
34
- claim: (name) => `($2::jsonb ->> ${quoteSqlLiteral(name)})`,
35
- claims: (name) => `(select jsonb_array_elements_text(case jsonb_typeof($2::jsonb -> ${quoteSqlLiteral(name)}) when 'array' then $2::jsonb -> ${quoteSqlLiteral(name)} else '[]'::jsonb end))`,
36
- column: (table, name, numeric) => `${table}.${ident(name)}${numeric === true ? "" : "::text"}`,
37
- literal: (value) => typeof value === "number" ? String(value) : quoteSqlLiteral(String(value))
38
- };
39
- /** At most this many queries per stream; a wider `or` product is left out rather than truncated. */
40
- const MAX_QUERIES = 32;
41
- /** Every combination of one clause list from each input, ANDed. */
42
- function product(lists) {
43
- let out = [[]];
44
- for (const list of lists) out = out.flatMap((left) => list.map((right) => left.concat(right)));
45
- return out;
46
- }
47
- function every(parts) {
48
- const out = [];
49
- for (const part of parts) {
50
- if (part === void 0) return;
51
- out.push(part);
52
- }
53
- return out;
54
- }
55
- /** The table as a stream query names it: unqualified in `public`, `schema.table` otherwise. */
56
- function bare(table) {
57
- return (table.startsWith("public.") ? table.slice(7) : table).split(".").map(ident).join(".");
58
- }
59
- /** A row value: a literal, or a principal ref the token carries. `undefined` when neither. */
60
- function valueSql(value, ctx) {
61
- if (isConditionRef(value)) {
62
- if (value.ref === "principal.id") return ctx.dialect.user;
63
- const claim = /^principal\.claims\.([A-Za-z_][A-Za-z0-9_]*)$/u.exec(value.ref)?.[1];
64
- return claim === void 0 ? void 0 : ctx.dialect.claim(claim);
65
- }
66
- if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") return ctx.dialect.literal(value);
67
- }
68
- const COMPARE = {
69
- eq: "=",
70
- ne: "!=",
71
- gt: ">",
72
- gte: ">=",
73
- lt: "<",
74
- lte: "<="
75
- };
76
- /**
77
- * A row condition as alternatives of ANDed clauses over `table`. `undefined`
78
- * when part of it has no Sync Streams form, so the grant syncs nothing.
79
- */
80
- function conditionSql(condition, table, ctx) {
81
- const column = (field) => SQL_IDENT.test(field) ? ctx.dialect.column(table, field) : void 0;
82
- switch (condition.op) {
83
- case "eq":
84
- case "ne":
85
- case "gt":
86
- case "gte":
87
- case "lt":
88
- case "lte": {
89
- const left = typeof condition.value === "number" && SQL_IDENT.test(condition.field) ? ctx.dialect.column(table, condition.field, true) : column(condition.field);
90
- if (condition.value === null && left !== void 0) return condition.op === "eq" ? [[`${left} IS NULL`]] : condition.op === "ne" ? [[`${left} IS NOT NULL`]] : void 0;
91
- const right = valueSql(condition.value, ctx);
92
- return left === void 0 || right === void 0 ? void 0 : [[`${left} ${COMPARE[condition.op]} ${right}`]];
93
- }
94
- case "isNull": {
95
- const left = column(condition.field);
96
- return left === void 0 ? void 0 : [[`${left} IS ${condition.value ? "" : "NOT "}NULL`]];
97
- }
98
- case "in":
99
- case "notIn": {
100
- const left = column(condition.field);
101
- if (left === void 0) return;
102
- const negate = condition.op === "notIn" ? "NOT " : "";
103
- if (isConditionRef(condition.value)) {
104
- const claim = /^principal\.claims\.([A-Za-z_][A-Za-z0-9_]*)$/u.exec(condition.value.ref)?.[1];
105
- return claim === void 0 || negate !== "" ? void 0 : [[`${left} IN ${ctx.dialect.claims(claim)}`]];
106
- }
107
- const values = condition.value.map((value) => isConditionRef(value) || isConditionDate(value) || Array.isArray(value) ? void 0 : value === null ? void 0 : valueSql(value, ctx));
108
- if (values.some((value) => value === void 0)) return;
109
- return values.length === 0 ? negate === "" ? [] : [[]] : [[`${left} ${negate}IN (${values.join(", ")})`]];
110
- }
111
- case "and":
112
- case "or": {
113
- const parts = every(condition.conditions.map((child) => conditionSql(child, table, ctx)));
114
- if (parts === void 0) return;
115
- return condition.op === "and" ? product(parts) : parts.flat();
116
- }
117
- case "memberOf": {
118
- if (condition.scope === "resource" || condition.parents !== void 0) return;
119
- const scope = resolveScope(ctx.scopes, condition.scope);
120
- const left = column(condition.field);
121
- if (scope === void 0 || left === void 0) return;
122
- return membershipSql(scope, left, condition.roles, ctx);
123
- }
124
- case "not":
125
- case "contains":
126
- case "related":
127
- case "opaque":
128
- case "sqlFunction":
129
- case "liveSession": return;
130
- default: return condition;
131
- }
132
- }
133
- /** One `IN (SELECT …)` per role source of the membership table: the row's `left` is an instance the user holds `roles` in. */
134
- function membershipIn(table, idColumn, left, roles, ctx) {
135
- if (table.expiresAt !== void 0 || table.disabledAt !== void 0) return;
136
- const name = bare(table.table);
137
- const sources = Array.isArray(table.role) ? table.role : [table.role];
138
- const kinds = [...new Set(roles.flatMap((role) => ctx.kinds[role] ?? []))];
139
- const restricted = roles.some((role) => ctx.kinds[role] !== void 0);
140
- if (restricted && (table.via === void 0 || roles.length !== 1)) return;
141
- const via = table.via;
142
- if (restricted && typeof via === "object" && !kinds.includes(via.value)) return [];
143
- const filters = [`${ctx.dialect.column(name, table.user)} = ${ctx.dialect.user}`, ...restricted && typeof via === "string" ? [`${ctx.dialect.column(name, via)} IN (${kinds.map((kind) => ctx.dialect.literal(kind)).join(", ")})`] : []];
144
- const list = roles.map((role) => ctx.dialect.literal(role)).join(", ");
145
- return sources.map((source) => {
146
- if (typeof source === "string") return [`${left} IN (SELECT ${ctx.dialect.column(name, idColumn)} FROM ${name} WHERE ${[...filters, `${ctx.dialect.column(name, source)} IN (${list})`].join(" AND ")})`];
147
- const [pair] = Object.entries(source.on);
148
- const keys = bare(source.through);
149
- const [ref, id] = pair ?? ["", ""];
150
- return [`${left} IN (SELECT ${ctx.dialect.column(name, idColumn)} FROM ${name} INNER JOIN ${keys} ON ${ctx.dialect.column(keys, id)} = ${ctx.dialect.column(name, ref)} WHERE ${[...filters, `${ctx.dialect.column(keys, source.column)} IN (${list})`].join(" AND ")})`];
151
- });
152
- }
153
- function membershipSql(scope, left, roles, ctx) {
154
- const table = scopeMembershipTable(ctx.config.rls?.memberships, ctx.scopes, scope);
155
- const idColumn = table === void 0 ? void 0 : scopeColumn(table, ctx.scopes, scope);
156
- return table === void 0 || idColumn === void 0 ? void 0 : membershipIn(table, idColumn, left, roles, ctx);
157
- }
158
- /** Who the grant reaches, as alternatives of clauses; `undefined` when Sync Streams cannot express it. */
159
- function accessSql(item, table, ctx) {
160
- const { access } = item;
161
- switch (access.kind) {
162
- case "anyone":
163
- case "authenticated": return [[]];
164
- case "role": {
165
- if (access.scope === "global") return `global role ${access.role} is not a row filter`;
166
- const field = ctx.policy.scopes.find((scope) => scope.name === access.scope)?.key;
167
- if (field === void 0 || !SQL_IDENT.test(field)) return `scope ${access.scope} has no row key`;
168
- return membershipSql(access.scope, ctx.dialect.column(table, field), [access.role], ctx) ?? `no rls.memberships table without an expiry or disabledAt and with the kinds of ${access.role} for scope ${access.scope}`;
169
- }
170
- case "resource": {
171
- const holder = ctx.config.rls?.memberships?.resource?.[access.resource];
172
- const node = ctx.policy.resources.get(item.grant.permission.resource);
173
- const field = node?.name === access.resource ? node.id : node?.parent?.resource === access.resource ? node.parent.field : void 0;
174
- if (holder === void 0 || field === void 0 || !SQL_IDENT.test(field)) return `no rls.memberships.resource table for ${access.resource} on the row`;
175
- return membershipIn(holder, holder.id ?? "id", ctx.dialect.column(table, field), [access.role], ctx) ?? `the ${access.resource} memberships table has an expiry or disabledAt, or lacks via`;
176
- }
177
- case "actor": return "actor grantees are not in the sync token";
178
- default: return access;
179
- }
180
- }
181
- /** `permdock_<table>`, with a schema joined by `_`; a table in the `permdock` schema keeps one prefix. */
182
- function subjectStreamName(table) {
183
- const name = table.replaceAll(".", "_");
184
- return name.startsWith("permdock_") ? name : `permdock_${name}`;
185
- }
186
- function roleThroughs(role) {
187
- return (Array.isArray(role) ? role : [role]).filter((item) => typeof item === "object" && item !== null);
188
- }
189
- /**
190
- * Streams of the rows a device builds the user's snapshot from: the user's
191
- * own membership and global-role rows, the roles tables they reference, and
192
- * the custom roles of the user's tenants. Each query starts from the user's
193
- * own rows.
194
- */
195
- function subjectStreams(ctx) {
196
- const rls = ctx.config.rls;
197
- const { dialect } = ctx;
198
- const tables = /* @__PURE__ */ new Map();
199
- const add = (table, query, user) => {
200
- const entry = tables.get(table) ?? {
201
- user: void 0,
202
- queries: /* @__PURE__ */ new Set()
203
- };
204
- if (entry.queries.size === 0) entry.user = user;
205
- else if (entry.user !== user) entry.user = void 0;
206
- entry.queries.add(query);
207
- tables.set(table, entry);
208
- };
209
- const own = (table, user, role) => {
210
- const name = bare(table);
211
- const mine = `${dialect.column(name, user)} = ${dialect.user}`;
212
- add(name, `SELECT * FROM ${name} WHERE ${mine}`, user);
213
- for (const through of roleThroughs(role)) {
214
- const keys = bare(through.through);
215
- const [pair] = Object.entries(through.on);
216
- if (pair === void 0) continue;
217
- const [ref, id] = pair;
218
- add(keys, `SELECT * FROM ${keys} WHERE ${dialect.column(keys, id)} IN (SELECT ${dialect.column(name, ref)} FROM ${name} WHERE ${mine})`);
219
- }
220
- };
221
- const memberships = rls?.memberships;
222
- for (const table of [
223
- ...Object.values(memberships?.scopes ?? {}),
224
- ...memberships?.tenant === void 0 ? [] : [memberships.tenant],
225
- ...memberships?.team === void 0 ? [] : [memberships.team],
226
- ...Object.values(memberships?.resource ?? {})
227
- ]) own(table.table, table.user, table.role);
228
- const schema = rls?.schema ?? "permdock";
229
- const database = rls?.authorize === "database";
230
- const globalRoles = rls?.roles ?? (database ? { table: `${schema}.user_roles` } : void 0);
231
- if (globalRoles !== void 0) own(globalRoles.table, globalRoles.user ?? "user_id", globalRoles.role ?? "role");
232
- if (database && customRolesOn(rls)) {
233
- const root = ctx.scopes[0]?.name;
234
- const tenants = root === void 0 ? void 0 : scopeMembershipTable(memberships, ctx.scopes, root);
235
- const column = tenants === void 0 || root === void 0 ? void 0 : scopeColumn(tenants, ctx.scopes, root);
236
- for (const name of [CUSTOM_ROLES.permissions, CUSTOM_ROLES.includes]) {
237
- const table = bare(`${schema}.${name}`);
238
- const tenant = dialect.column(table, "tenant_id");
239
- add(table, `SELECT * FROM ${table} WHERE ${tenant} IS NULL`);
240
- if (tenants !== void 0 && column !== void 0) {
241
- const members = bare(tenants.table);
242
- add(table, `SELECT * FROM ${table} WHERE ${tenant} IN (SELECT ${dialect.column(members, column)} FROM ${members} WHERE ${dialect.column(members, tenants.user)} = ${dialect.user})`);
243
- }
244
- }
245
- }
246
- const out = [];
247
- for (const [table, entry] of tables) {
248
- const name = subjectStreamName(table);
249
- const queries = [...entry.queries];
250
- out.push(entry.user === void 0 ? {
251
- name,
252
- table,
253
- queries
254
- } : {
255
- name,
256
- table,
257
- user: entry.user,
258
- queries
259
- });
260
- }
261
- return out;
262
- }
263
- /** Why a grant cannot become a stream query, before its conditions are compiled. */
264
- function unsupported(item) {
265
- const { grant } = item;
266
- if (grant.breakGlass !== void 0) return "break-glass";
267
- if (grant.closure !== void 0 || grant.portable === false) return "not portable";
268
- if (requiresApproval(grant.approval)) return "needs approval";
269
- if (grant.validity !== void 0) return "time-bounded";
270
- const context = contextRefs(item.where);
271
- return context.length > 0 ? `reads ${context.join(", ")}` : void 0;
272
- }
273
- /**
274
- * Sync Streams for each synced resource: the union of the rows its read
275
- * permission's allow grants reach. A grant with any part Sync Streams cannot
276
- * express syncs nothing, and a resource with a deny grant gets no stream, so
277
- * a stream never holds a row the policy denies.
278
- */
279
- function powersyncPlan(policy, config, dialect = POWERSYNC) {
280
- const scopes = scopeList(policy.scopes);
281
- const ctx = {
282
- policy,
283
- config,
284
- scopes,
285
- kinds: ownershipRules(policy, scopes)?.kinds ?? {},
286
- dialect
287
- };
288
- const action = config.powersync?.action ?? "read";
289
- const grants = collectGrants(policy);
290
- const resources = config.powersync?.resources ?? [...policy.resources.keys()].filter((name) => grants.some((item) => item.grant.permission.resource === name && item.grant.permission.action === action));
291
- const streams = [];
292
- const omitted = [];
293
- const warnings = [];
294
- for (const resource of resources) {
295
- const node = policy.resources.get(resource);
296
- const key = `${resource}.${action}`;
297
- const items = grants.filter((item) => item.grant.permission.key === key);
298
- if (node === void 0 || items.length === 0) {
299
- omitted.push({
300
- resource,
301
- reason: `no grant of ${key}`
302
- });
303
- continue;
304
- }
305
- if (items.some((item) => item.grant.effect === "deny")) {
306
- omitted.push({
307
- resource,
308
- reason: `${key} has a deny grant, which Sync Streams cannot subtract`
309
- });
310
- continue;
311
- }
312
- const table = bare(tableFor(resource, config.rls?.tables));
313
- const { id } = node;
314
- const queries = /* @__PURE__ */ new Set();
315
- for (const item of items) {
316
- const label = `${item.label}/${key}`;
317
- const access = unsupported(item) ?? accessSql(item, table, ctx);
318
- if (typeof access === "string") {
319
- warnings.push(`${label} does not sync: ${access}`);
320
- continue;
321
- }
322
- const where = item.where === void 0 ? [[]] : conditionSql(item.where, table, ctx);
323
- if (where === void 0) {
324
- warnings.push(`${label} does not sync: its condition has no Sync Streams form`);
325
- continue;
326
- }
327
- const columns = item.grant.fields === void 0 ? "*" : [.../* @__PURE__ */ new Set([id, ...item.grant.fields])].map((field) => ctx.dialect.column(table, field)).join(", ");
328
- for (const clauses of product([access, where])) queries.add(`SELECT ${columns} FROM ${table}${clauses.length === 0 ? "" : ` WHERE ${clauses.join(" AND ")}`}`);
329
- }
330
- if (queries.size === 0) omitted.push({
331
- resource,
332
- reason: `no grant of ${key} compiles`
333
- });
334
- else if (queries.size > MAX_QUERIES) omitted.push({
335
- resource,
336
- reason: `${String(queries.size)} queries, over the limit of ${String(MAX_QUERIES)}`
337
- });
338
- else streams.push({
339
- name: resource,
340
- resource,
341
- table,
342
- id,
343
- queries: [...queries]
344
- });
345
- }
346
- return {
347
- streams,
348
- subject: subjectStreams(ctx),
349
- omitted,
350
- warnings
351
- };
352
- }
353
- /** `sync-config.yaml`: edition 3 Sync Streams, one auto-subscribed stream per synced resource. */
354
- function powersyncYaml(plan) {
355
- const lines = [
356
- "# Generated by permdock powersync generate from the policy. Do not edit.",
357
- "config:",
358
- " edition: 3",
359
- "",
360
- "streams:"
361
- ];
362
- if (plan.streams.length === 0 && plan.subject.length === 0) lines[lines.length - 1] = "streams: {}";
363
- for (const stream of [...plan.streams, ...plan.subject]) lines.push(` ${stream.name}:`, " auto_subscribe: true", " queries:", ...stream.queries.map((query) => ` - ${JSON.stringify(query)}`));
364
- for (const item of plan.omitted) lines.push(`# ${item.resource}: not synced, ${item.reason}`);
365
- return `${lines.join("\n")}\n`;
366
- }
367
- //#endregion
368
- //#region src/cli/powersync/powersync.ts
369
- const POWERSYNC_HELP = `permdock powersync generate [--out sync-config.yaml] [--check]
370
- permdock powersync verify [--db-url-stdin] [--fixtures rls.fixtures.json]`;
371
- const DEFAULT_OUT = "sync-config.yaml";
372
- function powersyncOut(config, out) {
373
- return out ?? config.powersync?.out ?? DEFAULT_OUT;
374
- }
375
- function loadPolicy(cwd, config, from) {
376
- return requirePolicy(cwd, from ?? config.policy, "powersync needs policy in the config or --policy");
377
- }
378
- function sameJson(current, expected) {
379
- try {
380
- return JSON.stringify(JSON.parse(current)) === JSON.stringify(JSON.parse(expected));
381
- } catch {
382
- return false;
383
- }
384
- }
385
- /**
386
- * The files the policy compiles to: the Sync Streams file and, with
387
- * `powersync.manifest`, the local-snapshot manifest. `warnings` lists the
388
- * grants that do not sync.
389
- */
390
- function powersyncFiles(policy, config, out) {
391
- const plan = powersyncPlan(policy, config);
392
- const files = [{
393
- path: powersyncOut(config, out),
394
- text: powersyncYaml(plan)
395
- }];
396
- const manifest = config.powersync?.manifest;
397
- if (manifest !== void 0) files.push({
398
- path: manifest,
399
- json: true,
400
- text: `${JSON.stringify(localSnapshotManifest(policy), null, 2)}\n`
401
- });
402
- return {
403
- files,
404
- warnings: plan.warnings
405
- };
406
- }
407
- /** The files whose content on disk is not what the policy compiles to, with `missing` for an absent one. */
408
- function staleFiles(cwd, files) {
409
- const stale = [];
410
- for (const file of files) {
411
- const found = fileDrift(resolve(cwd, file.path), file.text, file.json === true ? sameJson : void 0);
412
- if (found !== void 0) stale.push({
413
- path: file.path,
414
- missing: found.kind === "missing"
415
- });
416
- }
417
- return stale;
418
- }
419
- function rowValue(row, key) {
420
- const value = key !== void 0 && row !== null && typeof row === "object" && !Array.isArray(row) ? Object.entries(row).find(([name]) => name === key)?.[1] : void 0;
421
- return value === void 0 || value === null ? void 0 : String(value);
422
- }
423
- function claimsJson(fixture) {
424
- return JSON.stringify(fixture.subject.claims ?? {});
425
- }
426
- /** Whether a stream of the user's own rows holds a row of another user. */
427
- async function leaks(query, stream, user, fixture) {
428
- for (const text of stream.queries) if ((await query(`select 1 from (${text}) q where q.${quoteIdent(user)}::text is distinct from $1::text and $2::jsonb is not null limit 1`, [fixture.subject.id, claimsJson(fixture)])).length > 0) return true;
429
- return false;
430
- }
431
- /** Whether the stream holds the fixture's row for its subject. */
432
- async function synced(query, stream, fixture) {
433
- const value = rowValue(fixture.row, stream.id);
434
- if (value === void 0) return false;
435
- for (const text of stream.queries) if ((await query(`select 1 from (${text}) q where q.${quoteIdent(stream.id)}::text = $3::text and $1::text is not null and $2::jsonb is not null limit 1`, [
436
- fixture.subject.id,
437
- claimsJson(fixture),
438
- value
439
- ])).length > 0) return true;
440
- return false;
441
- }
442
- async function verifyStreams(input) {
443
- const plan = powersyncPlan(input.policy, input.config, POSTGRES);
444
- const mismatches = [];
445
- const notes = [];
446
- const client = await input.connect(input.db);
447
- const query = async (sql, values) => (await client.query(sql, values)).rows;
448
- const root = input.policy.scopes.find((scope) => scope.within === void 0)?.key;
449
- try {
450
- const checked = /* @__PURE__ */ new Set();
451
- for (const fixture of input.fixtures) {
452
- if (checked.has(fixture.subject.id)) continue;
453
- checked.add(fixture.subject.id);
454
- for (const stream of plan.subject) if (stream.user !== void 0 && await leaks(query, stream, stream.user, fixture)) mismatches.push(`stream ${stream.name} syncs another user's ${stream.table} rows to ${fixture.subject.id}`);
455
- }
456
- for (const fixture of input.fixtures) {
457
- const permission = findPermission(input.policy.permissions, fixture.action);
458
- const stream = plan.streams.find((item) => permission !== void 0 && item.resource === permission.resource && permission.action === (input.config.powersync?.action ?? "read"));
459
- if (permission === void 0 || stream === void 0) continue;
460
- const tenant = rowValue(fixture.row, root);
461
- const permdock = await getPermDock(input.policy, fixtureSubject({
462
- ...fixture.subject,
463
- ...tenant === void 0 ? {} : { tenant }
464
- }), { customRoles: memoryCustomRoleSource(input.customRoles) });
465
- const granted = canFixture(permdock, permission, fixtureRow(fixture, permission.kind));
466
- const holds = await synced(query, stream, fixture);
467
- if (holds && !granted) mismatches.push(`${fixture.action} for ${fixture.subject.id}: stream ${stream.name} syncs a row the policy denies`);
468
- else if (granted && !holds) notes.push(`${fixture.action} for ${fixture.subject.id}: granted, not synced (the app reads it from the server)`);
469
- }
470
- } finally {
471
- await client.end();
472
- }
473
- return {
474
- mismatches,
475
- notes
476
- };
477
- }
478
- async function runPowerSync(input) {
479
- const [verb] = input.rest;
480
- if (verb !== "generate" && verb !== "verify") return {
481
- code: 2,
482
- output: POWERSYNC_HELP
483
- };
484
- let policy;
485
- let compiled;
486
- try {
487
- policy = await loadPolicy(input.cwd, input.config, input.from);
488
- compiled = powersyncFiles(policy, input.config, input.out);
489
- } catch (cause) {
490
- return usageResult(cause);
491
- }
492
- const { files, warnings } = compiled;
493
- const out = powersyncOut(input.config, input.out);
494
- const stale = staleFiles(input.cwd, files);
495
- if (verb === "generate") {
496
- if (input.check) return stale.length === 0 ? {
497
- code: 0,
498
- output: files.map((file) => `${file.path} is current`).join("\n")
499
- } : {
500
- code: 1,
501
- output: stale.map((file) => `${file.path} is stale: run permdock powersync generate`).join("\n")
502
- };
503
- applyFiles(input.cwd, files);
504
- return {
505
- code: 0,
506
- output: [...files.map((file) => `wrote ${file.path}`), ...warnings].join("\n")
507
- };
508
- }
509
- const mismatches = stale.map((file) => `${file.path} ${file.missing ? "is missing" : "differs from the policy"}: run permdock powersync generate`);
510
- const notes = [...warnings];
511
- if (input.db !== void 0) try {
512
- const fixturesPath = input.fixtures ?? input.config.rls?.fixtures ?? "rls.fixtures.json";
513
- const { fixtures, customRoles } = await loadFixtures(input.cwd, fixturesPath);
514
- const database = await verifyStreams({
515
- policy,
516
- config: input.config,
517
- fixtures,
518
- customRoles,
519
- db: input.db,
520
- connect: input.connect ?? pgConnector("permdock powersync verify --db-url-stdin", input.cwd)
521
- });
522
- mismatches.push(...database.mismatches);
523
- notes.push(...database.notes);
524
- } catch (cause) {
525
- return usageResult(cause);
526
- }
527
- if (mismatches.length > 0) return {
528
- code: 1,
529
- output: [...mismatches, ...notes].join("\n")
530
- };
531
- const verified = input.db === void 0 ? `${out} matches the policy` : `${out} matches the policy; no stream syncs a row the fixtures deny`;
532
- return {
533
- code: 0,
534
- output: notes.length === 0 ? verified : `${verified}\n${notes.join("\n")}`
535
- };
536
- }
537
- //#endregion
538
- export { runPowerSync as n, staleFiles as r, powersyncFiles as t };
@@ -1,32 +0,0 @@
1
- import { cancel, confirm, isCancel, multiselect } from "@clack/prompts";
2
- //#region src/cli/core/prompt.ts
3
- /** What a command reports when the person at the terminal cancels a prompt. */
4
- const CANCELLED = {
5
- code: 130,
6
- output: "Cancelled."
7
- };
8
- /** A yes or no question; `undefined` when cancelled. */
9
- async function ask(message) {
10
- const answer = await confirm({ message });
11
- if (isCancel(answer)) {
12
- cancel();
13
- return;
14
- }
15
- return answer;
16
- }
17
- /** Pick one or more of `options`, `initial` preselected; `undefined` when cancelled. */
18
- async function pick(message, options, initial) {
19
- const answer = await multiselect({
20
- message,
21
- options: options.map((option) => ({ ...option })),
22
- initialValues: [...initial],
23
- required: true
24
- });
25
- if (isCancel(answer)) {
26
- cancel();
27
- return;
28
- }
29
- return answer;
30
- }
31
- //#endregion
32
- export { ask as n, pick as r, CANCELLED as t };
@@ -1 +0,0 @@
1
- export { n as runCloudPull } from "./pull-BgIfno6w.js";
@@ -1 +0,0 @@
1
- export { t as run } from "./run-DOfMtc9V.js";
@@ -1 +0,0 @@
1
- export { i as runSupabase } from "./supabase-hook-DdDQhMlw.js";
@@ -1,91 +0,0 @@
1
- import { i as group, o as sqlStatements } from "./deciding-columns-Sq12mEA6.js";
2
- //#region src/cli/sql/supautils.ts
3
- /** `supautils.reserved_roles` of supabase/postgres 17.11.0.002 (supautils 3.4.4). */
4
- const RESERVED_ROLES = /* @__PURE__ */ new Set([
5
- "supabase_admin",
6
- "supabase_auth_admin",
7
- "supabase_storage_admin",
8
- "supabase_read_only_user",
9
- "supabase_realtime_admin",
10
- "supabase_replication_admin",
11
- "supabase_etl_admin",
12
- "supabase_privileged_role",
13
- "dashboard_user",
14
- "pgbouncer",
15
- "service_role",
16
- "authenticator",
17
- "authenticated",
18
- "anon"
19
- ]);
20
- /** The `*` entries of `reserved_roles`: `postgres` may still `set` or `reset` their settings. */
21
- const CONFIGURABLE_ROLES = /* @__PURE__ */ new Set([
22
- "service_role",
23
- "authenticator",
24
- "authenticated",
25
- "anon"
26
- ]);
27
- /** `supautils.reserved_memberships` of the same image. */
28
- const RESERVED_MEMBERSHIPS = /* @__PURE__ */ new Set([
29
- "pg_read_server_files",
30
- "pg_write_server_files",
31
- "pg_execute_server_program",
32
- "supabase_admin",
33
- "supabase_auth_admin",
34
- "supabase_storage_admin",
35
- "supabase_read_only_user",
36
- "supabase_realtime_admin",
37
- "supabase_replication_admin",
38
- "supabase_etl_admin",
39
- "dashboard_user",
40
- "pgbouncer",
41
- "authenticator"
42
- ]);
43
- const ROLE = String.raw`(?:"[^"]+"|\w+)`;
44
- const ROLES = String.raw`${ROLE}(?:\s*,\s*${ROLE})*`;
45
- const ALTER_ROLE = new RegExp(String.raw`^alter\s+(role|user|group)\s+(${ROLE})\s+([\s\S]*)$`, "iu");
46
- const DROP_ROLE = new RegExp(String.raw`^drop\s+(?:role|user|group)\s+(?:if\s+exists\s+)?(${ROLES})\s*$`, "iu");
47
- const GRANT_ROLE = /^grant\s+([\s\S]+?)\s+to\s/iu;
48
- const CREATE_IN_ROLE = new RegExp(String.raw`^create\s+(?:role|user|group)\s+${ROLE}\b[\s\S]*?\bin\s+(?:role|group)\s+(${ROLES})`, "iu");
49
- const CONFIG_CHANGE = /^(?:in\s+database\s+\S+\s+)?(?:set|reset)\s/iu;
50
- function roleName(name) {
51
- return name.replaceAll("\"", "").toLowerCase();
52
- }
53
- function roleList(list) {
54
- return list.split(",").map((name) => roleName(name.trim()));
55
- }
56
- function rejection(text) {
57
- const alter = ALTER_ROLE.exec(text);
58
- if (alter !== null) {
59
- const role = roleName(group(alter, 2));
60
- const rest = group(alter, 3);
61
- if (group(alter, 1).toLowerCase() === "group" && /^add\s/iu.test(rest)) return RESERVED_MEMBERSHIPS.has(role) ? `grants membership in the reserved role ${role}` : void 0;
62
- if (!RESERVED_ROLES.has(role) || CONFIGURABLE_ROLES.has(role) && CONFIG_CHANGE.test(rest)) return;
63
- return `changes the reserved role ${role}`;
64
- }
65
- const drop = DROP_ROLE.exec(text);
66
- if (drop !== null) {
67
- const role = roleList(group(drop, 1)).find((name) => RESERVED_ROLES.has(name));
68
- return role === void 0 ? void 0 : `drops the reserved role ${role}`;
69
- }
70
- const grant = GRANT_ROLE.exec(text);
71
- const granted = CREATE_IN_ROLE.exec(text)?.[1] ?? (grant === null || /\bon\b/iu.test(group(grant, 1)) ? void 0 : group(grant, 1));
72
- if (granted === void 0) return;
73
- const role = roleList(granted).find((name) => RESERVED_MEMBERSHIPS.has(name));
74
- return role === void 0 ? void 0 : `grants membership in the reserved role ${role}`;
75
- }
76
- /**
77
- * The statements of `sql` that supautils rejects for a non-superuser:
78
- * changing or dropping a reserved role, other than `set` or `reset` on the
79
- * four API roles, and granting a reserved membership.
80
- */
81
- function supautilsRejections(sql) {
82
- return sqlStatements(sql).flatMap(({ line, text }) => {
83
- const reason = rejection(text);
84
- return reason === void 0 ? [] : [{
85
- line,
86
- reason
87
- }];
88
- });
89
- }
90
- //#endregion
91
- export { supautilsRejections as t };
@@ -1,15 +0,0 @@
1
- import { createTwoFilesPatch } from "diff";
2
- //#region src/cli/core/text-diff.ts
3
- const MAX_LINES = 40;
4
- /**
5
- * A unified diff from the file on disk to what the command would write,
6
- * cut to the first {@link MAX_LINES} lines so a CI log stays readable.
7
- */
8
- function shortDiff(file, onDisk, next) {
9
- const lines = createTwoFilesPatch(`${file} (on disk)`, `${file} (generated)`, onDisk, next, void 0, void 0, { context: 2 }).split("\n").filter((line) => !line.startsWith("=====")).filter((line, index, all) => line !== "" || index < all.length - 1);
10
- if (lines.length <= MAX_LINES) return lines.join("\n");
11
- const rest = lines.length - MAX_LINES;
12
- return [...lines.slice(0, MAX_LINES), `… ${rest} more diff line${rest === 1 ? "" : "s"}`].join("\n");
13
- }
14
- //#endregion
15
- export { shortDiff as t };