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.
- package/README.md +1 -0
- package/dist/{2020-C9VN-x8c.js → 2020-CJbO8Bvz.js} +1 -3
- package/dist/a2a/index.d.ts +5 -5
- package/dist/a2a/index.js +4 -4
- package/dist/{adoption-scan-B4R5fnMU.js → adoption-scan-D-feE7BE.js} +1 -1
- package/dist/agent/index.d.ts +3 -3
- package/dist/agent/index.js +1 -1
- package/dist/ai-sdk/index.d.ts +21 -6
- package/dist/ai-sdk/index.js +19 -9
- package/dist/{approval-prompt-Djo_PyZc.d.ts → approval-prompt-K0faOLFp.d.ts} +2 -2
- package/dist/approvals/index.d.ts +4 -4
- package/dist/approvals/index.js +4 -4
- package/dist/{approvals-DJ6Yd5z1.js → approvals-CMRfsbBh.js} +74 -48
- package/dist/{arazzo-B6lebmiQ.js → arazzo-ClrF3PVb.js} +2 -2
- package/dist/{arazzo-BWhNF-k0.js → arazzo-rdeJ8n1J.js} +4 -4
- package/dist/{args-IIolxxKA.js → args-CC3OwyHW.js} +112 -2
- package/dist/astro/index.d.ts +6 -6
- package/dist/astro/index.js +2 -2
- package/dist/{audience-Dg8XsRaO.js → audience-BrMs8c4o.js} +1 -1
- package/dist/{auth-DRLEizbL.js → auth-CscUX8Sy.js} +3 -4
- package/dist/authzen/index.d.ts +162 -22
- package/dist/authzen/index.js +315 -146
- package/dist/{automation-BMZPIVUM.d.ts → automation-DOtAFWdy.d.ts} +3 -3
- package/dist/{automation-DVjOckjV.js → automation-ySsxp_Yp.js} +1 -1
- package/dist/base-url-BQbddZO5.js +9 -0
- package/dist/better-auth/index.d.ts +2 -2
- package/dist/better-auth/index.js +2 -2
- package/dist/better-supabase/index.d.ts +50 -8
- package/dist/better-supabase/index.js +94 -32
- package/dist/{bind-CZzhx-Vj.js → bind-D1nO6fiC.js} +5 -5
- package/dist/{bind--9EFVYWF.d.ts → bind-JDuvxjuW.d.ts} +7 -7
- package/dist/{build-instance-BMnAudHn.js → build-instance-DxE7czo9.js} +1 -1
- package/dist/{canonical-json-BC8_nMTw.js → canonical-json-DwilZ1iB.js} +6 -3
- package/dist/{capability-BSslw1QV.d.ts → capability-D4UC9TTW.d.ts} +2 -2
- package/dist/{capability-N1K9IpqS.js → capability-L7NnfhiE.js} +1 -1
- package/dist/{casbin-Cr7RLtA3.js → casbin-BHijLuHY.js} +2 -2
- package/dist/{casbin-Dyu2gnUD.js → casbin-BW9pS47J.js} +1 -1
- package/dist/{casl-64gpT-8x.js → casl-CmJlgziS.js} +2 -2
- package/dist/{casl-DjEDhTCP.js → casl-UbI8v-Wq.js} +1 -1
- package/dist/catalog/index.d.ts +70 -10
- package/dist/catalog/index.js +112 -6
- package/dist/catalog-BCCjSAdH.js +1 -0
- package/dist/{catalog-R_A__RsH.js → catalog-BaMQfQ6Y.js} +3 -3
- package/dist/{catalog-BECMPrwc.js → catalog-D69WhFii.js} +43 -13
- package/dist/{catalog-doc-C9wjsfNY.js → catalog-doc-CV9s6B1S.js} +28 -5
- package/dist/{catalog-fingerprint-CCP0-yQS.js → catalog-fingerprint-C144oW4M.js} +1 -1
- package/dist/{create-BWRSXgOF.js → challenge-nGWma08S.js} +122 -25
- package/dist/chat/index.d.ts +1 -1
- package/dist/chat/index.js +2 -2
- package/dist/chat-sdk/index.d.ts +3 -3
- package/dist/checks-BC_0mPIq.js +37 -0
- package/dist/claude-agent/index.d.ts +3 -3
- package/dist/claude-agent/index.js +2 -2
- package/dist/clerk/index.d.ts +3 -3
- package/dist/clerk/index.js +1 -1
- package/dist/cli/bin.js +2 -2
- package/dist/cli/index.d.ts +3 -3
- package/dist/cli/index.js +3 -3
- package/dist/cloud/index.d.ts +127 -11
- package/dist/cloud/index.js +251 -3
- package/dist/{cloud-CIoHNevm.js → cloud-CO8pYtwr.js} +5 -5
- package/dist/{codemod-Cxvvc70T.js → codemod-BP6n8N9L.js} +3 -3
- package/dist/{codemod-Bmj9dWMH.js → codemod-i4N2BhDc.js} +3 -3
- package/dist/{collect-CrZJJnEF.js → collect-BaWeMjwV.js} +17 -8
- package/dist/{collect-DloHbDVa.js → collect-DNm3oKOk.js} +6 -5
- package/dist/collect-k_Dulxr5.js +1 -0
- package/dist/compile/index.d.ts +1 -1
- package/dist/compile/index.js +1 -1
- package/dist/{compile-CMqMx_IN.js → compile-BAEO5bOk.js} +2 -2
- package/dist/{compile-Ckm2HqBZ.d.ts → compile-COM2VKuN.d.ts} +3 -3
- package/dist/{completion-BqhRBJD8.js → completion-BNdVf7X2.js} +3 -3
- package/dist/{config-bs_kZeYq.js → config-CoQHDrDi.js} +7 -3
- package/dist/{config-B46rm9sc.js → config-DGZzMV1B.js} +2 -2
- package/dist/{config-report-DUgj62Ai.js → config-report-Cm7UITNA.js} +3 -3
- package/dist/connector-schema-_VCSsdtD.js +433 -0
- package/dist/{context-bbFHR-0D.js → context--uM9V3Ui.js} +2 -2
- package/dist/convex/index.d.ts +5 -5
- package/dist/convex/index.js +2 -2
- package/dist/core-B5-w6Kw9.js +335 -0
- package/dist/core-CQkE8Esr.d.ts +179 -0
- package/dist/{create-0VZ7Pdiu.d.ts → create-B2-CQqCI.d.ts} +5 -5
- package/dist/{create-C3b4B5eF.js → create-Cb86Z8Im.js} +9 -8
- package/dist/{create-DnrmLnLW.js → create-DJrlhEp9.js} +5 -5
- package/dist/{create-BFfm17UA.d.ts → create-QHuuPw3q.d.ts} +7 -7
- package/dist/{create-BDS7wc3y.d.ts → create-UTnUVETj.d.ts} +30 -10
- package/dist/{credential-DM2um3ha.js → credential-CIM7wHwA.js} +4 -4
- package/dist/{credentials-DPyHmYz5.js → credentials-BpuTwd7a.js} +1 -1
- package/dist/{deciding-columns-Sq12mEA6.js → deciding-columns-DRo2QM6E.js} +13 -2
- package/dist/{delegation-DaXVdDhM.js → delegation-C5rOdTp5.js} +5 -5
- package/dist/delivery/index.d.ts +5 -5
- package/dist/delivery/index.js +4 -3
- package/dist/{delivery-DCAgNyCn.js → delivery-rwOKLWRm.js} +51 -2
- package/dist/{denied-text-D8jDHgsl.d.ts → denied-text-D4qkEtFz.d.ts} +2 -2
- package/dist/{describe-BybMRY7A.js → describe-DZlnEtLy.js} +1 -0
- package/dist/{describe-BZUsixiL.d.ts → describe-O0SwYIK8.d.ts} +2 -2
- package/dist/{diff-CxZo9pTq.js → diff-Btr1c1Ow.js} +2 -2
- package/dist/{diff-DCePiN6M.js → diff-DzT-xD13.js} +10 -10
- package/dist/{doctor-DFjUxf2f.js → doctor-BU1szn63.js} +241 -49
- package/dist/{doctor-CxiwSfqH.js → doctor-BoK_y0KO.js} +4 -4
- package/dist/drizzle/index.d.ts +3 -3
- package/dist/drizzle/index.js +1 -1
- package/dist/elysia/index.d.ts +5 -5
- package/dist/elysia/index.js +3 -3
- package/dist/{errors-C2PXIv4c.d.ts → errors-B_Qg9D3e.d.ts} +2 -2
- package/dist/{errors-CWTY6uih.js → errors-DpP_U6Bf.js} +1 -0
- package/dist/{evaluate-_R8QkWaf.js → evaluate-B_oqFbWC.js} +130 -34
- package/dist/{evaluations-16UqqQ6W.d.ts → evaluations-BCddEOfO.d.ts} +4 -4
- package/dist/{evaluations-DZ2CbV5k.js → evaluations-DReoiVBw.js} +4 -4
- package/dist/eve/index.d.ts +5 -5
- package/dist/eve/index.js +3 -3
- package/dist/express/index.d.ts +5 -5
- package/dist/express/index.js +3 -3
- package/dist/fastify/index.d.ts +5 -5
- package/dist/fastify/index.js +3 -3
- package/dist/{fetch-adapter-qKJBuRqy.d.ts → fetch-adapter-CuhyYwC1.d.ts} +4 -4
- package/dist/{fetch-adapter-g0ypLkID.js → fetch-adapter-De-u6vhJ.js} +3 -3
- package/dist/{fields-D9tPVUUS.js → fields-ClcQLrVc.js} +48 -13
- package/dist/{files-C5ZI27eV.js → files-acUbNwWt.js} +15 -2
- package/dist/{fixtures-B7XrLeY7.js → fixtures-BTMW6zgU.js} +2 -2
- package/dist/{flags-C3DktBDY.js → flags-aaeRAdiD.js} +2 -2
- package/dist/{from-snapshot-D2lZt4Dd.js → from-snapshot-Bz469dIh.js} +17 -10
- package/dist/generate-3FNO5P5Q.js +159 -0
- package/dist/{grantee-Cn1HyUsI.js → grantee-BrRANrpT.js} +14 -4
- package/dist/{grantee-conditions-CcXf8hMM.js → grantee-conditions-C6P1Tvol.js} +1 -1
- package/dist/{grantee-match-DHArqY82.js → grantee-match-0RtHWQDx.js} +3 -3
- package/dist/h3/index.d.ts +4 -4
- package/dist/h3/index.js +3 -3
- package/dist/{helpers-DTcZOzhF.js → helpers-DY3vXuGs.js} +3 -3
- package/dist/hono/index.d.ts +5 -5
- package/dist/hono/index.js +3 -3
- package/dist/{hosted-DBDX0M-P.d.ts → hosted-BmjzxQhp.d.ts} +14 -2
- package/dist/{hosted-BZIAYvon.js → hosted-XBgU6RGT.js} +34 -12
- package/dist/{http-DXJ37RDA.js → http-Ca3Sr5x1.js} +1 -1
- package/dist/{import-DMmOG27O.js → import-Bz0GefWg.js} +5 -5
- package/dist/{import-CNV7I2Dw.js → import-DB2EG_iy.js} +3 -3
- package/dist/{index-CxGUswIC.d.ts → index-BE8y3moU.d.ts} +50 -8
- package/dist/{index-Chrs5fQ-.d.ts → index-BSfRl0hZ.d.ts} +6 -6
- package/dist/{index-DOVf7RJv.d.ts → index-BTkwrK7v.d.ts} +155 -17
- package/dist/index-CMiPH2Tv.d.ts +206 -0
- package/dist/{index-SGdIQyzc.d.ts → index-DH9DUDEM.d.ts} +18 -3
- package/dist/{index-BcHcPyIo.d.ts → index-DLwcuCN_.d.ts} +86 -7
- package/dist/index.d.ts +18 -17
- package/dist/index.js +27 -25
- package/dist/{init-GG6Jh8HD.js → init-5TXNji88.js} +5 -5
- package/dist/{init-DeMYsnYJ.js → init-B-4t1NzC.js} +4 -4
- package/dist/{instance-options-Omfd793B.d.ts → instance-options-CU0YQCLH.d.ts} +1 -1
- package/dist/{instance-snapshot-Cxq4ygFc.js → instance-snapshot-CjcwnEiV.js} +20 -14
- package/dist/jwt/index.d.ts +83 -5
- package/dist/jwt/index.js +143 -5
- package/dist/{kernel-5JatXyND.js → kernel-DVExUwkp.js} +138 -12
- package/dist/kysely/index.d.ts +3 -3
- package/dist/kysely/index.js +1 -1
- package/dist/load-DrMHXzgN.js +1 -0
- package/dist/{load-DFS_ry0W.js → load-DxroEzH1.js} +2 -2
- package/dist/{login-Dfe5RlYk.js → login-ClSJh5t5.js} +4 -4
- package/dist/{login-imhuwvn3.js → login-WC9HPJpU.js} +6 -10
- package/dist/{manifest-C8IzW3Do.js → manifest-B79YuF2T.js} +6 -2
- package/dist/{manifest-mx5ghSFM.d.ts → manifest-BVhExYhw.d.ts} +23 -2
- package/dist/{manifest-CtKR3GXL.js → manifest-Dv6q4i5s.js} +54 -35
- package/dist/{manifest-schema-C0kK_8V0.js → manifest-schema-Cv492Qev.js} +37 -7
- package/dist/{map-claims-D3oRmTk0.js → map-claims-etGIS_Dv.js} +14 -11
- package/dist/{map-error-TCAdw-eW.js → map-error-BQGyDm_M.js} +1 -1
- package/dist/mcp/index.d.ts +64 -10
- package/dist/mcp/index.js +151 -22
- package/dist/{migrate-BShP7Vf4.js → migrate-Dodel0IJ.js} +77 -24
- package/dist/nest/index.d.ts +5 -5
- package/dist/nest/index.js +3 -3
- package/dist/next/index.d.ts +9 -9
- package/dist/next/index.js +5 -5
- package/dist/next/plugin.d.ts +1 -1
- package/dist/next/plugin.js +2 -2
- package/dist/node/index.d.ts +5 -5
- package/dist/node/index.js +2 -2
- package/dist/openai/index.d.ts +5 -5
- package/dist/openai/index.js +3 -3
- package/dist/openapi/index.d.ts +14 -4
- package/dist/openapi/index.js +1 -1
- package/dist/{openapi-ahr8rHu3.js → openapi-DMocl1bh.js} +4 -4
- package/dist/{openapi-B7HZ0f-r.js → openapi-Ddb4628T.js} +2 -7
- package/dist/{openapi-DTaEmTSW.js → openapi-ztVaux6j.js} +8 -8
- package/dist/{operation-findings-DgATDpvh.js → operation-findings-kRcEp8lE.js} +1 -1
- package/dist/{operations-CxybZErY.d.ts → operations-BNLes61x.d.ts} +1 -1
- package/dist/orpc/index.d.ts +6 -6
- package/dist/orpc/index.js +4 -4
- package/dist/otel/index.d.ts +3 -3
- package/dist/otel/index.js +1 -1
- package/dist/{output-Dyw8fyPF.js → output-DgSDLrta.js} +7 -3
- package/dist/{output-files-DhRBBE4n.js → output-files-CCMdcFWb.js} +2 -2
- package/dist/output-files-DPAY7-GX.js +1 -0
- package/dist/{ownership-BatFgAA4.js → ownership-Z2LpxsGa.js} +1349 -883
- package/dist/parse-Ddhz2xf4.js +148 -0
- package/dist/{parse-local-manifest-CVSs6J9I.js → parse-local-manifest-T1Q8X3A2.js} +24 -1
- package/dist/{parse-local-manifest-DgqtruPn.d.ts → parse-local-manifest-e4mdwAKd.d.ts} +1 -1
- package/dist/pdp/index.d.ts +3 -3
- package/dist/pdp/index.js +7 -3
- package/dist/peer-12Q5I_RH.js +976 -0
- package/dist/{peer-CRvC7Hg1.js → peer-DOzzMfZL.js} +1 -1
- package/dist/{permdock-B9JxkBwC.js → permdock-BfWEeMqk.js} +177 -49
- package/dist/{permdock-D7eeLJER.d.ts → permdock-Dco6dyCK.d.ts} +34 -5
- package/dist/{permission-registry-Br4jSNVi.js → permission-registry-DpPtSKNZ.js} +1 -1
- package/dist/{vocabulary-D6lPdb4Z.d.ts → permission-types-DhNEmoRG.d.ts} +4 -62
- package/dist/{permissions-oEWfl-kl.d.ts → permissions-CoqCOfJ3.d.ts} +2 -1
- package/dist/{permissions-B-wCP5ZC.js → permissions-CyH2MV_B.js} +1 -1
- package/dist/{permissions-CZKiUfFM.js → permissions-DArULThq.js} +4 -4
- package/dist/pkce-5h8NgMQJ.js +21 -0
- package/dist/{policies-CO1oOymN.js → policies-B2lZIurj.js} +3 -3
- package/dist/{policy-Czo4n3Hs.d.ts → policy-B7dg_yzu.d.ts} +2 -2
- package/dist/{policy-DLZJ5gAp.js → policy-DaJy4nK4.js} +17 -8
- package/dist/{policy-from-catalog-DzhEc3Y9.js → policy-from-catalog-DFWYkNdu.js} +9 -9
- package/dist/{policy-types-DzwivBgR.d.ts → policy-types-B-F-qAZk.d.ts} +109 -5
- package/dist/postgres-store-BL9M_CA1.js +1001 -0
- package/dist/{postgrest-NUqZT-RB.d.ts → postgrest-CYacM_u7.d.ts} +12 -1
- package/dist/{postgrest-CW0IqC-U.js → postgrest-r5faDIzD.js} +47 -5
- package/dist/{powersync-BHfuehf3.js → powersync-13odBwiM.js} +3 -3
- package/dist/powersync-53ryOZip.js +1059 -0
- package/dist/powersync-CExtTLyA.js +1 -0
- package/dist/preset/index.js +1 -1
- package/dist/{preset-DZdU0tne.js → preset-CHTbd-DQ.js} +2 -2
- package/dist/prisma/index.d.ts +2 -2
- package/dist/prisma/index.js +1 -1
- package/dist/{problem-details-DXlt-vks.d.ts → problem-details-Tcfmj3bV.d.ts} +1 -1
- package/dist/prompt-DwtVemER.js +935 -0
- package/dist/{protected-DEPHc2xV.d.ts → protected-BwZYL1X_.d.ts} +6 -5
- package/dist/{protected-DfjY5mLA.js → protected-DXE3cQYg.js} +2 -2
- package/dist/{provider-CC-u3bYP.js → provider-BQsTYYy0.js} +2 -2
- package/dist/{provider-DMVt6yYn.d.ts → provider-Csk-THAn.d.ts} +1 -1
- package/dist/{provider-store-B5Yrkhzr.js → provider-store-IgqQipCO.js} +2 -2
- package/dist/{pull-BgIfno6w.js → pull-CN5OLxrF.js} +7 -7
- package/dist/pull-Cty6Ovyu.js +1 -0
- package/dist/{push-CmFVBOeI.js → push-tVdG8dUL.js} +54 -14
- package/dist/{pushed-policy-BImMTTIM.d.ts → pushed-policy-BbcY9r_4.d.ts} +1 -1
- package/dist/{pushed-policy-DobP7AHI.js → pushed-policy-CmYeSQqq.js} +1 -1
- package/dist/react/index.d.ts +6 -6
- package/dist/react/index.js +3 -3
- package/dist/react/provider-client.d.ts +1 -1
- package/dist/react/provider-client.js +1 -1
- package/dist/react-native/index.d.ts +25 -11
- package/dist/react-native/index.js +214 -24
- package/dist/{refs-K6eWUJ0H.js → refs-CNJBiTFo.js} +15 -1
- package/dist/{replay-D7iKcLFe.d.ts → replay-DCDD_ZfL.d.ts} +1 -1
- package/dist/{request-context-BTRTG7OT.js → request-context-BykKLmyE.js} +2 -2
- package/dist/resend/index.d.ts +4 -4
- package/dist/{retire-CALjIQ7e.js → retire-Wj6dkyDE.js} +2 -2
- package/dist/{rls-BA8an5Ap.js → rls-Ck_PocSp.js} +32 -8
- package/dist/{rls-j6t43t7n.js → rls-CxBZb4rZ.js} +478 -534
- package/dist/{role-builder-CXbis5-X.js → role-builder-C1VJzvcr.js} +3 -3
- package/dist/rolldown-runtime-C3I60J0A.js +4 -0
- package/dist/{rpc-aPyNi6tA.js → rpc-Bk1bE-ch.js} +1 -1
- package/dist/run-Bz7DXGEv.js +1 -0
- package/dist/{run-ticket-sxFI6LAk.js → run-ticket-B5d_63Ma.js} +22 -1
- package/dist/{run-ticket-BjhTOi6u.d.ts → run-ticket-BpNi7BCi.d.ts} +8 -3
- package/dist/{run-DOfMtc9V.js → run-uLD2aWuO.js} +7 -7
- package/dist/{runtime-D3VTAiCA.js → runtime-Vif3_-zf.js} +1 -1
- package/dist/{saas-FO-Q8oj0.js → saas-Az_Kz-4D.js} +7 -7
- package/dist/{scan-BOI5tJ-6.js → scan-DSljDE1Y.js} +1 -1
- package/dist/{schema-yLuBWWsh.js → schema-gIcCx7zM.js} +1 -1
- package/dist/scim/index.d.ts +3 -2
- package/dist/scim/index.js +3 -1
- package/dist/scim-C7JYhySg.js +44 -0
- package/dist/{scim-ClHtpyV3.js → scim-YNieBO1U.js} +3 -537
- package/dist/{scopes-CUPSjo9q.js → scopes-BHsc-wp-.js} +1 -1
- package/dist/server/index.d.ts +11 -11
- package/dist/server/index.js +7 -7
- package/dist/{server-DqCT4CgZ.js → server-Bnga6I50.js} +3 -3
- package/dist/{server-types-BLd4MnBX.d.ts → server-types-C4gZUEZy.d.ts} +9 -9
- package/dist/{shared-DvvFzYXe.js → shared-C8LjUdVU.js} +1 -1
- package/dist/{shared-CD11nBbC.js → shared-fMKOv8hP.js} +46 -39
- package/dist/{sink-Bj_lDUDq.d.ts → sink-Cp_Eot9W.d.ts} +4 -4
- package/dist/{skills-B6lVdD_W.js → skills-Dcjw9_1C.js} +5 -5
- package/dist/{skills-CTYwkl44.js → skills-g_3BS9NC.js} +3 -3
- package/dist/{snapshot-CXUWfsNy.js → snapshot-CbGmYiJx.js} +4 -4
- package/dist/{snapshot-cache-DZHQ0KF6.js → snapshot-cache-DT2Kx1F8.js} +1 -1
- package/dist/{snapshot-cache-DqK9eDmM.d.ts → snapshot-cache-Pahd3IYJ.d.ts} +1 -1
- package/dist/solid/index.d.ts +6 -5
- package/dist/solid/index.js +4 -4
- package/dist/solid-start/index.d.ts +6 -6
- package/dist/solid-start/index.js +3 -3
- package/dist/{sources-vs5dGOsS.js → sources-B-zYB4GS.js} +111 -25
- package/dist/{sources-BV9j0DeZ.d.ts → sources-DEEuGb8S.d.ts} +63 -14
- package/dist/sources-qoIJQrJv.js +11 -0
- package/dist/{sql-B5T1IL83.js → sql-B96movIM.js} +5 -1
- package/dist/sql-CDEPCA0g.d.ts +10 -0
- package/dist/{src-DLfUWFAI.js → src-DLFrtrrC.js} +154 -53
- package/dist/ssf/index.d.ts +4 -4
- package/dist/ssf/index.js +640 -211
- package/dist/{standard-webhooks-6lg8v_is.d.ts → standard-webhooks-B_qRg0ws.d.ts} +2 -2
- package/dist/{store-4u_hxjWa.js → store-DSP9oGvh.js} +15 -7
- package/dist/{store-options-BqEakYRa.js → store-options-B_poyYvg.js} +6 -6
- package/dist/{stores-ClZUgeoP.d.ts → stores-BAZwSYZA.d.ts} +6 -5
- package/dist/{stores-BbsD4fAR.js → stores-BqEuHC05.js} +2 -2
- package/dist/{stream-7-xmnf3U.d.ts → stream-2Vwhl7Er.d.ts} +2 -2
- package/dist/{style-Uao76wO7.js → style-Cqo7-73x.js} +1 -0
- package/dist/{style-DiKWnAvn.js → style-Ds1gNm77.js} +1 -1
- package/dist/supabase/index.d.ts +8 -7
- package/dist/supabase/index.js +5 -5
- package/dist/supabase/middleware.d.ts +6 -6
- package/dist/supabase/middleware.js +6 -6
- package/dist/{supabase-Dxlp8A94.js → supabase--0aJdLEd.js} +9 -7
- package/dist/{supabase-9pqI57pW.js → supabase-Bqp7iIY2.js} +3 -3
- package/dist/supabase-hook-DJxC4PoP.js +1 -0
- package/dist/{supabase-hook-DdDQhMlw.js → supabase-hook-Dg0SrQWR.js} +1069 -123
- package/dist/supautils-MESd81bF.js +689 -0
- package/dist/{support-session-C6xJQYut.js → support-session-Cna49-3f.js} +2 -2
- package/dist/svelte/index.d.ts +5 -5
- package/dist/svelte/index.js +5 -5
- package/dist/svelte/runtime.d.ts +3 -3
- package/dist/svelte/runtime.js +3 -3
- package/dist/svelte/source.d.ts +5 -5
- package/dist/svelte/source.js +2 -2
- package/dist/sveltekit/index.d.ts +6 -6
- package/dist/sveltekit/index.js +2 -2
- package/dist/tanstack-start/index.d.ts +6 -6
- package/dist/tanstack-start/index.js +2 -2
- package/dist/{tenancy-DN2QAx9z.js → tenancy-CmeBQ6Nv.js} +12 -3
- package/dist/terminal/index.d.ts +6 -6
- package/dist/terminal/index.js +3 -3
- package/dist/testing/core.d.ts +2 -0
- package/dist/testing/core.js +1 -0
- package/dist/testing/fixtures/index.d.ts +12 -0
- package/dist/testing/fixtures/index.js +770 -0
- package/dist/testing/index.d.ts +41 -174
- package/dist/testing/index.js +241 -731
- package/dist/testing/saas/index.d.ts +5 -5
- package/dist/testing/saas/index.js +2 -2
- package/dist/testing/saas/permissions.d.ts +1 -1
- package/dist/testing/saas/permissions.js +1 -1
- package/dist/text-diff-DhITNCnD.js +444 -0
- package/dist/{token-BLZcjQgt.js → token-2qYDvXz2.js} +1 -1
- package/dist/{tool-refusal-CMLN5xhn.js → tool-refusal-reAhIzdl.js} +1 -1
- package/dist/trpc/index.d.ts +6 -6
- package/dist/trpc/index.js +3 -3
- package/dist/{types-5Ut_pbKy.d.ts → types-BWZybqs9.d.ts} +112 -8
- package/dist/{types-CZTnPFzM.d.ts → types-BXMYB7BY.d.ts} +2 -2
- package/dist/{types-CdlxsYQh.d.ts → types-BfVmNJO5.d.ts} +14 -3
- package/dist/{types-BqAKcRNW.d.ts → types-CIeZcG8v.d.ts} +2 -2
- package/dist/{types-BNORmDM8.d.ts → types-CKV71kKh.d.ts} +4 -4
- package/dist/{types-tIgIeIKJ.d.ts → types-CQVEQawv.d.ts} +4 -4
- package/dist/{types-BjV-fqcA.d.ts → types-CeIscIKp.d.ts} +4 -4
- package/dist/{types-_sHy8BQf.d.ts → types-CfiKC5aN.d.ts} +1 -1
- package/dist/{types-ClZaWzfb.d.ts → types-D3A19w4A.d.ts} +8 -4
- package/dist/{types-C8-KNsFf.d.ts → types-DBHftjgS.d.ts} +15 -8
- package/dist/{types-CCpc2Dcv.d.ts → types-DC44-hqb.d.ts} +2 -2
- package/dist/{types-fbZ7JEXr.d.ts → types-DXmwu78Z.d.ts} +4 -4
- package/dist/{types-DiQjupG2.d.ts → types-cTos-H7p.d.ts} +2 -2
- package/dist/{types-DX0LaKTb.d.ts → types-g7Oy6Zg4.d.ts} +3 -3
- package/dist/unplugin/index.d.ts +1 -1
- package/dist/unplugin/index.js +2 -2
- package/dist/{usage-T5mXq98v.js → usage-Bybmck7f.js} +7 -7
- package/dist/{usage-DHtE8j4E.js → usage-CDaLXCfL.js} +2 -2
- package/dist/usage-y-kBNdqs.js +1 -0
- package/dist/{validation-error-Bg5Tpluk.d.ts → validation-error-CQpoquwj.d.ts} +1 -1
- package/dist/{verify-DbCL9bnB.js → verify-pe8rL_Qw.js} +350 -83
- package/dist/{views-DTIIO-oQ.js → views-BB8E9dTP.js} +1 -1
- package/dist/vocabulary-Bg3eeT2H.d.ts +67 -0
- package/dist/vue/index.d.ts +6 -5
- package/dist/vue/index.js +4 -4
- package/dist/{waiter-CKy4MQSY.d.ts → waiter-DwEyouan.d.ts} +2 -2
- package/dist/watch-Bd9mx3rd.js +1 -0
- package/dist/{watch-CszoTJMq.js → watch-C-4VmFlL.js} +3 -3
- package/dist/webmcp/index.d.ts +2 -2
- package/dist/webmcp/index.js +2 -2
- package/dist/{where-scope-Dv-WTP-w.js → where-scope-wq2coopv.js} +41 -21
- package/dist/{who-can-D0QoYbEb.js → who-can-BwNsI_Js.js} +6 -6
- package/dist/workflow/index.d.ts +3 -3
- package/dist/workflow/index.js +5 -5
- package/dist/workflow-sdk/index.d.ts +5 -5
- package/dist/{wrap-Bd1Tejur.d.ts → wrap-B6R0cMRL.d.ts} +2 -2
- package/dist/{wrap-gX61EtpB.js → wrap-CiSc_KCq.js} +8 -2
- package/package.json +22 -11
- package/schemas/cli-result-v1.json +1 -0
- package/schemas/cloud-api-v1.json +152 -7
- package/schemas/connector-v1.json +8 -0
- package/schemas/supabase-claims-v1.json +5 -0
- package/schemas/supabase-manifest-v1.json +276 -75
- package/skills/permdock/SKILL.md +1 -0
- package/skills/permdock-agents/references/runtimes.md +3 -1
- package/skills/permdock-approvals/references/stores-and-resume.md +2 -1
- package/skills/permdock-data/references/queries-and-rls.md +5 -2
- package/skills/permdock-tenancy/SKILL.md +1 -1
- package/skills/permdock-tenancy/references/ownership-and-custom-roles.md +2 -0
- package/skills/permdock-wire/references/adapters.md +14 -0
- package/skills/permdock-wire/references/policy-options.md +1 -0
- package/dist/catalog-DjhMYYCq.js +0 -1
- package/dist/collect-FlXJlhus.js +0 -1
- package/dist/index-D8EovfsP.d.ts +0 -91
- package/dist/load-BxEtwlBS.js +0 -1
- package/dist/output-files-B3IZJksC.js +0 -1
- package/dist/parse-Cxq0WxrA.js +0 -53
- package/dist/peer-C8swJ2GH.js +0 -50
- package/dist/powersync-CbzkqL_M.js +0 -1
- package/dist/powersync-bYUDLOAO.js +0 -538
- package/dist/prompt-DfZLJLIn.js +0 -32
- package/dist/pull-ByOks_Tg.js +0 -1
- package/dist/run-CNsApDpd.js +0 -1
- package/dist/supabase-hook-CXcGpHqq.js +0 -1
- package/dist/supautils-B6HYL9eL.js +0 -91
- package/dist/text-diff-BQcUapOb.js +0 -15
- package/dist/usage-CHOtwL19.js +0 -1
- package/dist/watch-Cb-NcaUw.js +0 -1
|
@@ -1,41 +1,43 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { c as listPermissions, h as formerKeys } from "./permission-registry-
|
|
1
|
+
import { o as hasConditionOp } from "./refs-CNJBiTFo.js";
|
|
2
|
+
import { c as listPermissions, h as formerKeys } from "./permission-registry-DpPtSKNZ.js";
|
|
3
3
|
import { u as isPrincipalRelation } from "./resource-relations-D_jw0BFx.js";
|
|
4
|
-
import { t as canonicalJson } from "./canonical-json-
|
|
5
|
-
import {
|
|
6
|
-
import { o as flattenGrantee } from "./grantee-
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import { s as parseCredential } from "./credential-
|
|
10
|
-
import { a as describeError } from "./errors-
|
|
4
|
+
import { t as canonicalJson } from "./canonical-json-DwilZ1iB.js";
|
|
5
|
+
import { f as scopeList, o as normalizeMemberships, s as resolveScope } from "./scopes-BHsc-wp-.js";
|
|
6
|
+
import { o as flattenGrantee } from "./grantee-BrRANrpT.js";
|
|
7
|
+
import { l as separationConflicts } from "./policy-DaJy4nK4.js";
|
|
8
|
+
import { T as validateCustomRole } from "./evaluate-B_oqFbWC.js";
|
|
9
|
+
import { s as parseCredential } from "./credential-CIM7wHwA.js";
|
|
10
|
+
import { a as describeError } from "./errors-DpP_U6Bf.js";
|
|
11
11
|
import { t as policyRowConditionKeys } from "./row-conditions-h2HythXQ.js";
|
|
12
12
|
import { a as rel, n as doctorSrcPath, o as sqlFiles, r as listSourceFiles } from "./files-D_JIzUrP.js";
|
|
13
13
|
import { i as DOCTOR_REPORT_SCHEMA } from "./version-CEbQ5UeM.js";
|
|
14
|
-
import {
|
|
15
|
-
import { a as loadModule, i as loadConfiguredPolicy, n as asPolicy, s as pickNamed } from "./load-
|
|
16
|
-
import { r as runCollect } from "./collect-
|
|
14
|
+
import { c as jsonSchemaOf, i as catalogOAuthScopes } from "./catalog-doc-CV9s6B1S.js";
|
|
15
|
+
import { a as loadModule, i as loadConfiguredPolicy, n as asPolicy, s as pickNamed } from "./load-DxroEzH1.js";
|
|
16
|
+
import { r as runCollect } from "./collect-BaWeMjwV.js";
|
|
17
17
|
import { t as catalogPath } from "./catalog-path-CnI0XTFK.js";
|
|
18
|
+
import { i as qualifySqlTable, s as quoteSqlLiteral } from "./sql-B96movIM.js";
|
|
19
|
+
import { i as scopeMembershipTable } from "./compile-BAEO5bOk.js";
|
|
18
20
|
import { n as supabaseTenantClaim } from "./budget-NbEtbJC_.js";
|
|
19
|
-
import {
|
|
20
|
-
import {
|
|
21
|
-
import { t as parseCatalog } from "./parse-Cxq0WxrA.js";
|
|
21
|
+
import { d as keptKeys, r as PERMDOCK_SCHEMA } from "./sources-B-zYB4GS.js";
|
|
22
|
+
import { t as parseCatalog } from "./parse-Ddhz2xf4.js";
|
|
22
23
|
import "./markers-C6joDI3o.js";
|
|
23
|
-
import { t as didYouMean } from "./args-
|
|
24
|
-
import { t as DOCS_BASE } from "./manifest-
|
|
25
|
-
import { t as createStyle } from "./style-
|
|
26
|
-
import { r as findingOf } from "./output-
|
|
27
|
-
import { i as runSkillsInstall } from "./skills-
|
|
24
|
+
import { t as didYouMean } from "./args-CC3OwyHW.js";
|
|
25
|
+
import { t as DOCS_BASE } from "./manifest-Dv6q4i5s.js";
|
|
26
|
+
import { t as createStyle } from "./style-Cqo7-73x.js";
|
|
27
|
+
import { r as findingOf } from "./output-DgSDLrta.js";
|
|
28
|
+
import { i as runSkillsInstall } from "./skills-Dcjw9_1C.js";
|
|
28
29
|
import { n as MIGRATION_DIRS, t as DEFAULT_SENSITIVE_ACTIONS } from "./constants-DcJABbLW.js";
|
|
29
|
-
import { l as partPath } from "./output-files-
|
|
30
|
-
import { _ as
|
|
31
|
-
import {
|
|
32
|
-
import {
|
|
33
|
-
import {
|
|
34
|
-
import { d as
|
|
35
|
-
import {
|
|
36
|
-
import {
|
|
37
|
-
import {
|
|
38
|
-
import { t as supautilsRejections } from "./supautils-
|
|
30
|
+
import { l as partPath } from "./output-files-CCMdcFWb.js";
|
|
31
|
+
import { _ as readSupabaseConfig, a as supabaseHookManifest, d as resolveSchemas, g as pd074, h as pd045, l as pd039, m as attrsPlan, n as hookOut, v as supabaseConfig } from "./supabase-hook-Dg0SrQWR.js";
|
|
32
|
+
import { D as byKey, U as graphSqlName, o as guardedTables, r as unsatisfiedKinds, t as ownershipRules, z as contextRefs } from "./ownership-Z2LpxsGa.js";
|
|
33
|
+
import { t as membershipSourcesOf } from "./sources-qoIJQrJv.js";
|
|
34
|
+
import { i as group, n as membershipColumns, o as sqlStatements, r as tableKey } from "./deciding-columns-DRo2QM6E.js";
|
|
35
|
+
import { a as pd010, c as pd014, d as pd038, f as pd041, i as pd008, l as pd015, n as pd001, o as pd011, p as pd057, r as pd007, s as pd013, t as runUsage, u as pd036 } from "./usage-Bybmck7f.js";
|
|
36
|
+
import { _ as helperTablePolicies, b as compileGrants, d as tableNames, i as graphPlan, m as ROW_CONDITION_FIX, u as tableNameOf, v as rowConditionMessage, x as tableFor, y as commandFor } from "./verify-pe8rL_Qw.js";
|
|
37
|
+
import { t as FIELD_VIEWS } from "./fields-ClcQLrVc.js";
|
|
38
|
+
import { a as streamOf, i as scopeSourcesOf, r as staleFiles, t as powersyncFiles } from "./powersync-53ryOZip.js";
|
|
39
|
+
import { a as generateOptions, c as buildContext, n as inheritTargets, o as isRefusal, t as supautilsRejections } from "./supautils-MESd81bF.js";
|
|
40
|
+
import { n as legacyHelperNames, r as retirePlan, t as legacyHelperCalls } from "./retire-Wj6dkyDE.js";
|
|
39
41
|
import { existsSync, readFileSync, readdirSync, statSync } from "node:fs";
|
|
40
42
|
import { basename, dirname, join, resolve } from "node:path";
|
|
41
43
|
import { createRequire } from "node:module";
|
|
@@ -831,11 +833,26 @@ async function pd035(input) {
|
|
|
831
833
|
}
|
|
832
834
|
//#endregion
|
|
833
835
|
//#region src/cli/doctor/powersync.ts
|
|
836
|
+
/** Why each membership source of a scope the streams read through sources has no stream form, once per source. */
|
|
837
|
+
function sourceGaps(policy, config) {
|
|
838
|
+
const scopes = scopeList(policy.scopes);
|
|
839
|
+
const sources = membershipSourcesOf(config);
|
|
840
|
+
const gaps = /* @__PURE__ */ new Set();
|
|
841
|
+
for (const scope of scopes) {
|
|
842
|
+
if (scopeMembershipTable(config.rls?.memberships, scopes, scope.name) !== void 0) continue;
|
|
843
|
+
for (const source of scopeSourcesOf(sources, scope.name)) {
|
|
844
|
+
const stream = streamOf(source);
|
|
845
|
+
if (typeof stream === "string") gaps.add(stream);
|
|
846
|
+
}
|
|
847
|
+
}
|
|
848
|
+
return [...gaps];
|
|
849
|
+
}
|
|
834
850
|
/**
|
|
835
851
|
* PD058: `sync-config.yaml` or the `powersync.manifest` file is not what the
|
|
836
852
|
* policy compiles to, so PowerSync syncs rows, or the device builds
|
|
837
853
|
* snapshots, by an older policy. A policy that does not compile is a finding
|
|
838
|
-
* too
|
|
854
|
+
* too, and so is each membership source of a synced scope with no stream
|
|
855
|
+
* form: its members sync none of the rows it grants.
|
|
839
856
|
*/
|
|
840
857
|
async function pd058(input) {
|
|
841
858
|
const { cwd, config } = input;
|
|
@@ -853,12 +870,18 @@ async function pd058(input) {
|
|
|
853
870
|
fix: "fix the powersync and rls config, then run permdock powersync generate"
|
|
854
871
|
}];
|
|
855
872
|
}
|
|
856
|
-
|
|
873
|
+
const gaps = sourceGaps(policy, config).map((gap) => ({
|
|
874
|
+
code: "PD058",
|
|
875
|
+
severity: "warning",
|
|
876
|
+
message: gap,
|
|
877
|
+
fix: "build the source with tableMembershipSource or junctionMembershipSource, without expiresAt or disabledAt, or serve its members from the server"
|
|
878
|
+
}));
|
|
879
|
+
return [...staleFiles(cwd, compiled.files).map((file) => ({
|
|
857
880
|
code: "PD058",
|
|
858
881
|
severity: "warning",
|
|
859
882
|
message: file.missing ? `${file.path} is missing, so ${file.path === config.powersync?.manifest ? "the device builds no local snapshot" : "PowerSync syncs no stream the policy compiles to"}` : `${file.path} is not what the policy compiles to, so ${file.path === config.powersync?.manifest ? "the device builds snapshots" : "PowerSync syncs rows"} by an older policy`,
|
|
860
883
|
fix: "run permdock powersync generate and deploy the files"
|
|
861
|
-
}));
|
|
884
|
+
})), ...gaps];
|
|
862
885
|
}
|
|
863
886
|
//#endregion
|
|
864
887
|
//#region src/cli/doctor/project.ts
|
|
@@ -1229,8 +1252,8 @@ async function pd030(input) {
|
|
|
1229
1252
|
for (const resource of resources) {
|
|
1230
1253
|
const columns = limitedColumns(policy, resource, rls.actions);
|
|
1231
1254
|
if (columns.length === 0) continue;
|
|
1232
|
-
const table = tableFor(resource, rls.tables);
|
|
1233
|
-
if (rls.fields
|
|
1255
|
+
const table = tableFor(resource, tableNames(rls.tables));
|
|
1256
|
+
if (rls.fields === void 0) {
|
|
1234
1257
|
findings.push({
|
|
1235
1258
|
code: "PD030",
|
|
1236
1259
|
severity: "warning",
|
|
@@ -1336,6 +1359,32 @@ async function pd034(input) {
|
|
|
1336
1359
|
}));
|
|
1337
1360
|
}
|
|
1338
1361
|
/**
|
|
1362
|
+
* PD076: `rls.actions` entries set to `'none'` that change nothing: a verb
|
|
1363
|
+
* that is not one of the six default verbs and does not read as a write
|
|
1364
|
+
* compiles to no policy anyway, and a verb no permission uses compiles to
|
|
1365
|
+
* nothing at all. A write-sounding `none` stays, because it silences PD071.
|
|
1366
|
+
*/
|
|
1367
|
+
async function pd076(input) {
|
|
1368
|
+
const actions = input.config.rls?.actions;
|
|
1369
|
+
if (actions === void 0 || input.config.policy === void 0) return [];
|
|
1370
|
+
const policy = await policyOf(input);
|
|
1371
|
+
if (policy === void 0) return [];
|
|
1372
|
+
const used = new Set(listPermissions(policy.vocabulary.permissions).map((leaf) => leaf.action));
|
|
1373
|
+
const unused = Object.keys(actions).filter((verb) => !used.has(verb)).toSorted();
|
|
1374
|
+
const noop = Object.entries(actions).filter(([verb, command]) => command === "none" && used.has(verb) && commandFor(verb) === void 0 && !suggestsWrite(verb)).map(([verb]) => verb).toSorted();
|
|
1375
|
+
return [...noop.length === 0 ? [] : [{
|
|
1376
|
+
code: "PD076",
|
|
1377
|
+
severity: "info",
|
|
1378
|
+
message: `rls.actions sets ${noop.join(", ")} to 'none', which is already what ${noop.length === 1 ? "that verb compiles" : "those verbs compile"} to`,
|
|
1379
|
+
fix: `delete these entries: ${noop.join(", ")}`
|
|
1380
|
+
}], ...unused.length === 0 ? [] : [{
|
|
1381
|
+
code: "PD076",
|
|
1382
|
+
severity: "info",
|
|
1383
|
+
message: `rls.actions maps ${unused.join(", ")}, which no permission uses`,
|
|
1384
|
+
fix: `delete these entries, or fix the verb's spelling: ${unused.join(", ")}`
|
|
1385
|
+
}]];
|
|
1386
|
+
}
|
|
1387
|
+
/**
|
|
1339
1388
|
* Storage and Realtime policies written outside PermDock that call the SQL helpers for a permission whose grants
|
|
1340
1389
|
* carry row conditions: the helpers check only role and scope.
|
|
1341
1390
|
*/
|
|
@@ -1399,20 +1448,94 @@ async function pd071(input) {
|
|
|
1399
1448
|
fix: `map it on purpose in rls.actions: ${verb}: "insert", "update", "delete" or "none"`
|
|
1400
1449
|
}));
|
|
1401
1450
|
}
|
|
1451
|
+
/**
|
|
1452
|
+
* PD072: a membership source reads role keys through the table of custom
|
|
1453
|
+
* roles (`rls.customRoleWrites.roles`), which tenants write.
|
|
1454
|
+
*/
|
|
1455
|
+
function pd072(input) {
|
|
1456
|
+
const roles = input.config.rls?.customRoleWrites?.roles;
|
|
1457
|
+
if (roles?.tenant === void 0) return [];
|
|
1458
|
+
const target = qualifySqlTable(roles.table);
|
|
1459
|
+
return membershipSourcesOf(input.config).filter((source) => source.sql.throughs.some((through) => through.table === target)).map((source) => ({
|
|
1460
|
+
code: "PD072",
|
|
1461
|
+
severity: "warning",
|
|
1462
|
+
message: `the ${source.sql.table} membership source reads role keys through ${target}, whose tenant rows tenants write: a tenant row named like a declared role must not grant it`,
|
|
1463
|
+
fix: `keep the permdock_custom_role_name_guard trigger on ${target} (rls generate emits it with customRoleWrites.roles) and generate with this config, so helpers read a tenant row named like a declared role as no role`
|
|
1464
|
+
}));
|
|
1465
|
+
}
|
|
1466
|
+
/** PD073: a role's `for` lists kinds no membership source of its scope can hold. */
|
|
1467
|
+
async function pd073(input) {
|
|
1468
|
+
const rls = input.config.rls;
|
|
1469
|
+
if (rls === void 0 || input.config.policy === void 0) return [];
|
|
1470
|
+
const policy = await policyOf(input);
|
|
1471
|
+
if (policy === void 0) return [];
|
|
1472
|
+
const scopes = scopeList(policy.scopes);
|
|
1473
|
+
const ownership = ownershipRules(policy, scopes);
|
|
1474
|
+
const sources = membershipSourcesOf(input.config);
|
|
1475
|
+
const ctx = {
|
|
1476
|
+
dialect: "supabase",
|
|
1477
|
+
scopes,
|
|
1478
|
+
tenantClaim: "tenant_id",
|
|
1479
|
+
gucPrefix: "app",
|
|
1480
|
+
...rls.memberships === void 0 ? {} : { memberships: rls.memberships },
|
|
1481
|
+
...sources === void 0 ? {} : { memberSources: sources },
|
|
1482
|
+
...ownership === void 0 ? {} : { ownership }
|
|
1483
|
+
};
|
|
1484
|
+
return unsatisfiedKinds(ctx, policy).map((item) => ({
|
|
1485
|
+
code: "PD073",
|
|
1486
|
+
severity: "error",
|
|
1487
|
+
message: `role ${item.role} is for ${item.for.join(", ")}, but its membership sources hold ${item.sources.join(", ")}: no membership can hold it`,
|
|
1488
|
+
fix: `set via on one of those sources to ${item.for.join(" or ")}, or change for on role ${item.role}`
|
|
1489
|
+
}));
|
|
1490
|
+
}
|
|
1491
|
+
/**
|
|
1492
|
+
* PD075: two resources that `rls.tables` maps to one table, each with its own
|
|
1493
|
+
* keys and helpers for the same rows. `doctor.sharedTables` lists tables split
|
|
1494
|
+
* on purpose (two resources over disjoint rows).
|
|
1495
|
+
*/
|
|
1496
|
+
async function pd075(input) {
|
|
1497
|
+
const rls = input.config.rls;
|
|
1498
|
+
if (rls === void 0 || input.config.policy === void 0) return [];
|
|
1499
|
+
const policy = await policyOf(input);
|
|
1500
|
+
if (policy === void 0) return [];
|
|
1501
|
+
const allowed = new Set((input.config.doctor?.sharedTables ?? []).map(qualifySqlTable));
|
|
1502
|
+
const byTable = /* @__PURE__ */ new Map();
|
|
1503
|
+
for (const leaf of listPermissions(policy.vocabulary.permissions)) {
|
|
1504
|
+
const table = qualifySqlTable(tableNameOf(rls.tables?.[leaf.resource], leaf.resource));
|
|
1505
|
+
byTable.set(table, (byTable.get(table) ?? /* @__PURE__ */ new Set()).add(leaf.resource));
|
|
1506
|
+
}
|
|
1507
|
+
return [...byTable.entries()].filter(([table, resources]) => resources.size > 1 && !allowed.has(table)).toSorted(byKey).map(([table, resources]) => {
|
|
1508
|
+
return {
|
|
1509
|
+
code: "PD075",
|
|
1510
|
+
severity: "warning",
|
|
1511
|
+
message: `rls.tables maps ${[...resources].toSorted().join(" and ")} to ${table}, so the same rows carry two sets of keys and helpers`,
|
|
1512
|
+
fix: `merge them into one resource (https://permdock.com/docs/guides/merge-resources), or list ${table} in doctor.sharedTables when the resources cover disjoint rows`
|
|
1513
|
+
};
|
|
1514
|
+
});
|
|
1515
|
+
}
|
|
1402
1516
|
//#endregion
|
|
1403
1517
|
//#region src/cli/doctor/seeds.ts
|
|
1404
1518
|
const SEED_INSERT = /^insert\s+into\s+((?:"[^"]+"|\w+)(?:\.(?:"[^"]+"|\w+))?)\s*\(\s*role\s*,\s*permission\s*,\s*grant_key\s*,\s*scope\s*,\s*effect\s*\)\s*values\s*([\s\S]*?)\s*on\s+conflict\b/iu;
|
|
1405
1519
|
const SEED_CLEAR = /^delete\s+from\s+((?:"[^"]+"|\w+)(?:\.(?:"[^"]+"|\w+))?)\s*$/iu;
|
|
1406
1520
|
const LITERAL = String.raw`'((?:[^']|'')*)'`;
|
|
1407
1521
|
const SEED_ROW = new RegExp(String.raw`\(\s*${LITERAL}\s*,\s*${LITERAL}\s*,\s*${LITERAL}\s*,\s*${LITERAL}\s*,\s*${LITERAL}\s*\)`, "gu");
|
|
1522
|
+
const SEED_VIEW = /^create\s+(?:or\s+replace\s+)?view\s+((?:"[^"]+"|\w+)(?:\.(?:"[^"]+"|\w+))?)\s*\([^)]*\)\s*with\s*\([^)]*\)\s*as\s+([\s\S]*)$/iu;
|
|
1523
|
+
const SEED_FUNCTION = /^create\s+(?:or\s+replace\s+)?function\s+(?:"[^"]+"|\w+)\.(?:"seed"|seed)\s*\(\s*\)[\s\S]*?\$(\w*)\$([\s\S]*)\$\1\$/iu;
|
|
1408
1524
|
function rowKey(values) {
|
|
1409
1525
|
return values.join(" ");
|
|
1410
1526
|
}
|
|
1527
|
+
/** The statements of a file, with the body of `<schema>.seed()` (`rls.seeds: 'function'`) in place of its `create function`. */
|
|
1528
|
+
function seedStatements(sql) {
|
|
1529
|
+
return sqlStatements(sql).flatMap((statement) => {
|
|
1530
|
+
const fn = SEED_FUNCTION.exec(statement.text);
|
|
1531
|
+
return fn === null ? [statement] : sqlStatements(group(fn, 2));
|
|
1532
|
+
});
|
|
1533
|
+
}
|
|
1411
1534
|
/** The rows of the last statement that seeds or clears `table`, in migration order. */
|
|
1412
1535
|
function lastSeed(files, cwd, config, table) {
|
|
1413
1536
|
let seeded;
|
|
1414
|
-
for (const file of sqlFiles(cwd, config.doctor?.migrations ?? MIGRATION_DIRS)) for (const { text } of
|
|
1415
|
-
const insert = SEED_INSERT.exec(text);
|
|
1537
|
+
for (const file of sqlFiles(cwd, config.doctor?.migrations ?? MIGRATION_DIRS)) for (const { text } of seedStatements(files.read(file))) {
|
|
1538
|
+
const insert = SEED_INSERT.exec(text) ?? SEED_VIEW.exec(text);
|
|
1416
1539
|
if (insert !== null && tableKey(group(insert, 1)) === table) {
|
|
1417
1540
|
const rows = /* @__PURE__ */ new Set();
|
|
1418
1541
|
for (const row of group(insert, 2).matchAll(SEED_ROW)) rows.add(rowKey(row.slice(1, 6).map((value) => value.replaceAll("''", "'"))));
|
|
@@ -1447,18 +1570,26 @@ async function pd054(input) {
|
|
|
1447
1570
|
if (seeded === void 0) return [];
|
|
1448
1571
|
const policy = await policyOf(input);
|
|
1449
1572
|
if (policy === void 0) return [];
|
|
1450
|
-
const
|
|
1573
|
+
const generate = {
|
|
1574
|
+
cwd,
|
|
1575
|
+
config,
|
|
1576
|
+
target: "sql",
|
|
1451
1577
|
dialect: rls?.dialect ?? "supabase",
|
|
1452
|
-
|
|
1453
|
-
|
|
1454
|
-
|
|
1455
|
-
|
|
1456
|
-
|
|
1457
|
-
|
|
1578
|
+
rbac: false,
|
|
1579
|
+
check: false,
|
|
1580
|
+
skipClosures: true,
|
|
1581
|
+
inlineFunctions: false,
|
|
1582
|
+
io: {
|
|
1583
|
+
stdout: () => void 0,
|
|
1584
|
+
stderr: () => void 0
|
|
1585
|
+
}
|
|
1458
1586
|
};
|
|
1459
1587
|
let expected;
|
|
1460
1588
|
try {
|
|
1461
|
-
|
|
1589
|
+
const options = generateOptions(generate);
|
|
1590
|
+
const built = isRefusal(options) ? options : buildContext(generate, policy, options);
|
|
1591
|
+
if (isRefusal(built)) return [];
|
|
1592
|
+
expected = new Set(compileGrants(policy, built.ctx, tableNames(rls?.tables), [], true, rls?.rowHelpers !== void 0 || inheritTargets(policy).length > 0).rolePermissions.map((row) => rowKey([
|
|
1462
1593
|
row.role,
|
|
1463
1594
|
row.permission,
|
|
1464
1595
|
row.grantKey,
|
|
@@ -1582,25 +1713,51 @@ function revokedExecute(statements) {
|
|
|
1582
1713
|
}
|
|
1583
1714
|
return revoked;
|
|
1584
1715
|
}
|
|
1716
|
+
/** `supabase.hook.claims` and `hook.before` functions, by key, with the argument type the hook calls them with. */
|
|
1717
|
+
function hookClaimFunctions(config) {
|
|
1718
|
+
const hook = config.supabase?.hook;
|
|
1719
|
+
const before = hook?.before;
|
|
1720
|
+
const functions = /* @__PURE__ */ new Map();
|
|
1721
|
+
for (const fn of Object.values(hook?.claims ?? {})) if (typeof fn === "string") functions.set(tableKey(fn), "uuid");
|
|
1722
|
+
for (const fn of typeof before === "string" ? [before] : before ?? []) if (typeof fn === "string") functions.set(tableKey(fn), "jsonb");
|
|
1723
|
+
return functions;
|
|
1724
|
+
}
|
|
1585
1725
|
/**
|
|
1586
1726
|
* PD049: a `security definer` function `public` (every role) or, in Supabase's
|
|
1587
1727
|
* `public` schema, `anon` may still execute: Postgres grants `execute` to
|
|
1588
1728
|
* `public` on create, and Supabase's default privileges grant it to `anon`.
|
|
1729
|
+
* A hook claim function returns any user's claims, so `authenticated` must
|
|
1730
|
+
* not execute it either, definer or not.
|
|
1589
1731
|
*/
|
|
1590
1732
|
function pd049(cwd, config, files = nodeFiles) {
|
|
1591
1733
|
if (!isSupabase(files, cwd, config)) return [];
|
|
1592
1734
|
const statements = migrationStatements(files, cwd, config);
|
|
1593
1735
|
const revoked = revokedExecute(statements);
|
|
1736
|
+
const hookFunctions = hookClaimFunctions(config);
|
|
1594
1737
|
const findings = [];
|
|
1595
1738
|
for (const fn of createdFunctions(statements)) {
|
|
1596
|
-
|
|
1739
|
+
const hookArgument = hookFunctions.get(fn.key);
|
|
1740
|
+
if (hookArgument === void 0 && (!/\bsecurity\s+definer\b/iu.test(fn.head) || /\breturns\s+(?:event_)?trigger\b/iu.test(fn.head))) continue;
|
|
1597
1741
|
const schema = schemaOf(fn.key);
|
|
1598
1742
|
const from = /* @__PURE__ */ new Set([
|
|
1599
1743
|
...revoked.get(fn.key) ?? [],
|
|
1600
1744
|
...revoked.get(`${schema}.*`) ?? [],
|
|
1601
1745
|
...revoked.get("*.*") ?? []
|
|
1602
1746
|
]);
|
|
1603
|
-
const missing = ["public", ...schema === "public" ? ["anon"] : []]
|
|
1747
|
+
const missing = (hookArgument === void 0 ? ["public", ...schema === "public" ? ["anon"] : []] : [
|
|
1748
|
+
"public",
|
|
1749
|
+
"anon",
|
|
1750
|
+
"authenticated"
|
|
1751
|
+
]).filter((role) => !from.has(role));
|
|
1752
|
+
if (missing.length > 0 && hookArgument !== void 0) {
|
|
1753
|
+
findings.push({
|
|
1754
|
+
code: "PD049",
|
|
1755
|
+
severity: "warning",
|
|
1756
|
+
message: `${fn.file}:${String(fn.line)} hook claim function ${fn.key} returns any user's claims and can be executed by ${missing.join(" and ")}`,
|
|
1757
|
+
fix: `regenerate the hook (permdock rls generate), which revokes it, or add revoke all on function ${fn.key}(${hookArgument}) from public, anon, authenticated;`
|
|
1758
|
+
});
|
|
1759
|
+
continue;
|
|
1760
|
+
}
|
|
1604
1761
|
if (missing.length > 0) findings.push({
|
|
1605
1762
|
code: "PD049",
|
|
1606
1763
|
severity: "warning",
|
|
@@ -2078,6 +2235,26 @@ const DOCTOR_CHECKS = [
|
|
|
2078
2235
|
groups: ["rls"],
|
|
2079
2236
|
run: pd071
|
|
2080
2237
|
},
|
|
2238
|
+
{
|
|
2239
|
+
code: "PD072",
|
|
2240
|
+
groups: ["rls"],
|
|
2241
|
+
run: pd072
|
|
2242
|
+
},
|
|
2243
|
+
{
|
|
2244
|
+
code: "PD073",
|
|
2245
|
+
groups: ["rls", "ownership"],
|
|
2246
|
+
run: pd073
|
|
2247
|
+
},
|
|
2248
|
+
{
|
|
2249
|
+
code: "PD075",
|
|
2250
|
+
groups: ["rls"],
|
|
2251
|
+
run: pd075
|
|
2252
|
+
},
|
|
2253
|
+
{
|
|
2254
|
+
code: "PD076",
|
|
2255
|
+
groups: ["rls"],
|
|
2256
|
+
run: pd076
|
|
2257
|
+
},
|
|
2081
2258
|
{
|
|
2082
2259
|
code: "PD028",
|
|
2083
2260
|
groups: ["attrs", "supabase"],
|
|
@@ -2181,6 +2358,12 @@ const DOCTOR_CHECKS = [
|
|
|
2181
2358
|
groups: ["supabase"],
|
|
2182
2359
|
run: (project) => pd045(project.cwd)
|
|
2183
2360
|
},
|
|
2361
|
+
{
|
|
2362
|
+
code: "PD074",
|
|
2363
|
+
groups: ["supabase", "helpers"],
|
|
2364
|
+
when: (config) => config.supabase?.hook !== void 0,
|
|
2365
|
+
run: (project) => pd074(project.cwd, project.config)
|
|
2366
|
+
},
|
|
2184
2367
|
...[
|
|
2185
2368
|
["PD046", pd046],
|
|
2186
2369
|
["PD047", pd047],
|
|
@@ -2333,15 +2516,24 @@ function formatDoctor(report, color) {
|
|
|
2333
2516
|
for (const change of report.fixed) lines.push(` ${style.okMark} fixed ${change}`);
|
|
2334
2517
|
if (report.fixed.length > 0) lines.push("");
|
|
2335
2518
|
for (const finding of report.findings) {
|
|
2336
|
-
const mark = finding.severity
|
|
2519
|
+
const mark = markOf(finding.severity, style);
|
|
2337
2520
|
lines.push(` ${mark} ${style.paint("bold", finding.code)} ${finding.message}`);
|
|
2338
2521
|
lines.push(` ${style.paint("dim", `fix: ${finding.fix}`)}`);
|
|
2339
2522
|
}
|
|
2340
2523
|
if (report.findings.length === 0) lines.push(" no findings");
|
|
2341
2524
|
lines.push("");
|
|
2342
|
-
|
|
2525
|
+
const notes = report.findings.filter((finding) => finding.severity === "info").length;
|
|
2526
|
+
lines.push(` ${String(report.errors)} error${report.errors === 1 ? "" : "s"}, ${String(report.warnings)} warning${report.warnings === 1 ? "" : "s"}${notes === 0 ? "" : `, ${String(notes)} note${notes === 1 ? "" : "s"}`}`);
|
|
2343
2527
|
return `${lines.join("\n")}\n`;
|
|
2344
2528
|
}
|
|
2529
|
+
function markOf(severity, style) {
|
|
2530
|
+
switch (severity) {
|
|
2531
|
+
case "error": return style.errorMark;
|
|
2532
|
+
case "warning": return style.warnMark;
|
|
2533
|
+
case "info": return style.infoMark;
|
|
2534
|
+
default: return severity;
|
|
2535
|
+
}
|
|
2536
|
+
}
|
|
2345
2537
|
async function supabaseSetup(input) {
|
|
2346
2538
|
const policy = await input.policy();
|
|
2347
2539
|
if (policy === void 0) return [];
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { t as defineLeaf } from "./command-L8EstFNm.js";
|
|
2
|
-
import { a as failOnFlag } from "./flags-
|
|
3
|
-
import { n as ask, t as CANCELLED } from "./prompt-
|
|
2
|
+
import { a as failOnFlag } from "./flags-aaeRAdiD.js";
|
|
3
|
+
import { n as ask, t as CANCELLED } from "./prompt-DwtVemER.js";
|
|
4
4
|
//#region src/cli/commands/doctor.ts
|
|
5
5
|
const doctor = defineLeaf({
|
|
6
6
|
flags: {
|
|
@@ -10,7 +10,7 @@ const doctor = defineLeaf({
|
|
|
10
10
|
description: "Check codes or groups to run",
|
|
11
11
|
valueHint: "code",
|
|
12
12
|
async complete() {
|
|
13
|
-
const { DOCTOR_CHECKS } = await import("./doctor-
|
|
13
|
+
const { DOCTOR_CHECKS } = await import("./doctor-BU1szn63.js");
|
|
14
14
|
return [.../* @__PURE__ */ new Set([...DOCTOR_CHECKS.map(({ code }) => code), ...DOCTOR_CHECKS.flatMap(({ groups }) => groups)])];
|
|
15
15
|
}
|
|
16
16
|
},
|
|
@@ -27,7 +27,7 @@ const doctor = defineLeaf({
|
|
|
27
27
|
if (answer === void 0) return CANCELLED;
|
|
28
28
|
fix = answer;
|
|
29
29
|
}
|
|
30
|
-
return (await import("./doctor-
|
|
30
|
+
return (await import("./doctor-BU1szn63.js")).runDoctor({
|
|
31
31
|
cwd: ctx.cwd,
|
|
32
32
|
config: ctx.config,
|
|
33
33
|
only: flags.only,
|
package/dist/drizzle/index.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { Rt as Instant,
|
|
2
|
-
import {
|
|
1
|
+
import { Rt as Instant, lr as Subject, mr as Condition } from "../policy-types-B-F-qAZk.js";
|
|
2
|
+
import { u as WhereResult } from "../permdock-Dco6dyCK.js";
|
|
3
3
|
import { r as RelationsMapping } from "../graph-sql-B-dsAT6j.js";
|
|
4
|
-
import { s as MembershipsMapping } from "../compile-
|
|
4
|
+
import { s as MembershipsMapping } from "../compile-COM2VKuN.js";
|
|
5
5
|
import { n as WithSubjectOptions, t as RowCheck } from "../row-check-Dt35czLy.js";
|
|
6
6
|
import { SQL, Table } from "drizzle-orm";
|
|
7
7
|
//#region src/drizzle/types.d.ts
|
package/dist/drizzle/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { t as compact } from "../compact-CAf557ZB.js";
|
|
2
2
|
import { t as assertSafeKey } from "../paths-DXSHAMIa.js";
|
|
3
|
-
import { n as escapeLike, t as compileWhere } from "../compile-
|
|
3
|
+
import { n as escapeLike, t as compileWhere } from "../compile-BAEO5bOk.js";
|
|
4
4
|
import { a as rowCheckFrom, i as templateOf, r as subjectStatements, s as loadPeer, t as statementTemplate } from "../subject-settings-CkEwrw3W.js";
|
|
5
5
|
//#region src/drizzle/to-where.ts
|
|
6
6
|
function loadOperators(injected) {
|
package/dist/elysia/index.d.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { T as Policy, j as PolicyVocabulary,
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
1
|
+
import { T as Policy, j as PolicyVocabulary, sr as Principal } from "../policy-types-B-F-qAZk.js";
|
|
2
|
+
import { u as Permission } from "../permission-types-DhNEmoRG.js";
|
|
3
|
+
import { a as PermDock } from "../permdock-Dco6dyCK.js";
|
|
4
4
|
import { n as RevocationFeed } from "../revocations-R07lFBnX.js";
|
|
5
|
-
import { D as ConnectionOptions, T as Connection, f as InvalidSignatureError, i as OpenApiHooks, o as ProtectOptions, v as discoverViaSignatureAgent, x as webBotAuthVerifier } from "../server-types-
|
|
6
|
-
import { t as ServerAdapterOptions } from "../bind
|
|
5
|
+
import { D as ConnectionOptions, T as Connection, f as InvalidSignatureError, i as OpenApiHooks, o as ProtectOptions, v as discoverViaSignatureAgent, x as webBotAuthVerifier } from "../server-types-C4gZUEZy.js";
|
|
6
|
+
import { t as ServerAdapterOptions } from "../bind-JDuvxjuW.js";
|
|
7
7
|
import { Elysia } from "elysia";
|
|
8
8
|
//#region src/elysia/create.d.ts
|
|
9
9
|
type ElysiaRequestContext = {
|
package/dist/elysia/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { a as parsedBody, r as hasCredentials } from "../http-BBoKefeS.js";
|
|
2
|
-
import {
|
|
3
|
-
import { t as problemFromError } from "../map-error-
|
|
4
|
-
import { a as socketConnection, i as decorate, r as bindKernel } from "../bind-
|
|
2
|
+
import { l as InvalidSignatureError, p as webBotAuthVerifier, u as discoverViaSignatureAgent } from "../evaluations-DReoiVBw.js";
|
|
3
|
+
import { t as problemFromError } from "../map-error-BQGyDm_M.js";
|
|
4
|
+
import { a as socketConnection, i as decorate, r as bindKernel } from "../bind-D1nO6fiC.js";
|
|
5
5
|
import { a as onRevoked, n as closeReason, t as POLICY_VIOLATION } from "../stream-CvdUS9V1.js";
|
|
6
6
|
import { Elysia } from "elysia";
|
|
7
7
|
//#region src/elysia/create.ts
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { t as Disclosure } from "./problem-details-
|
|
1
|
+
import { Ln as Decision, ln as WireDenial, lr as Subject } from "./policy-types-B-F-qAZk.js";
|
|
2
|
+
import { t as Disclosure } from "./problem-details-Tcfmj3bV.js";
|
|
3
3
|
import { StandardSchemaV1 } from "@standard-schema/spec";
|
|
4
4
|
//#region src/core/errors.d.ts
|
|
5
5
|
/** Where and how a human approves; carries no secret. */
|
|
@@ -18,6 +18,7 @@ const CODES = {
|
|
|
18
18
|
dirty_worktree: ["Uncommitted changes", 3],
|
|
19
19
|
write_failed: ["Write failed", 1],
|
|
20
20
|
check_failed: ["Out of date", 1],
|
|
21
|
+
catalog_invalid: ["Invalid catalog", 1],
|
|
21
22
|
input_required: ["Input required", 3],
|
|
22
23
|
consent_required: ["Consent required", 3],
|
|
23
24
|
cancelled: ["Cancelled", 130],
|