permdock 0.7.0 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -3
- package/dist/a2a/index.d.ts +7 -7
- package/dist/a2a/index.js +8 -8
- package/dist/action-result-CL-QCITA.d.ts +19 -0
- package/dist/{adapter-context-CRhqyzCk.js → adapter-context-CIQpQxbE.js} +8 -2
- package/dist/{adoption-scan-D-feE7BE.js → adoption-scan-BLs67P1l.js} +5 -5
- package/dist/agent/index.d.ts +2 -2
- package/dist/agent/index.js +1 -1
- package/dist/ai-sdk/index.d.ts +19 -13
- package/dist/ai-sdk/index.js +6 -6
- package/dist/{app-data-MuyzVqX8.js → app-data-UNNm07jV.js} +10 -7
- package/dist/{approval-header-CJACtHkv.js → approval-header-8QV6MU4H.js} +6 -3
- package/dist/{approval-prompt-Dg5LeAcT.js → approval-prompt-B8hQY69x.js} +5 -6
- package/dist/{approval-prompt-K0faOLFp.d.ts → approval-prompt-PYagyQUj.d.ts} +13 -11
- package/dist/approvals/index.d.ts +4 -4
- package/dist/approvals/index.js +6 -6
- package/dist/{approvals-CMRfsbBh.js → approvals-DnIBTuXE.js} +66 -42
- package/dist/{approvers-CqPOLD-o.js → approvers-B4r0N_Uz.js} +8 -2
- package/dist/{arazzo-ClrF3PVb.js → arazzo-3RhGfkAK.js} +2 -2
- package/dist/{arazzo-rdeJ8n1J.js → arazzo-B5-ulWif.js} +6 -6
- package/dist/{args-CC3OwyHW.js → args-0FrVs5EH.js} +14 -7
- package/dist/astro/index.d.ts +30 -12
- package/dist/astro/index.js +2 -2
- package/dist/{audience-BrMs8c4o.js → audience-BAkBDMqn.js} +8 -8
- package/dist/{auth-CscUX8Sy.js → auth--yPyZNgr.js} +19 -7
- package/dist/authzen/index.d.ts +34 -28
- package/dist/authzen/index.js +23 -20
- package/dist/{automation-DOtAFWdy.d.ts → automation-DqEoWHBc.d.ts} +42 -32
- package/dist/{automation-ySsxp_Yp.js → automation-x3KEUusw.js} +22 -21
- package/dist/better-auth/index.d.ts +2 -2
- package/dist/better-auth/index.js +13 -7
- package/dist/better-supabase/index.d.ts +357 -227
- package/dist/better-supabase/index.js +219 -140
- package/dist/{bind-JDuvxjuW.d.ts → bind-Cp2hBHzP.d.ts} +27 -12
- package/dist/{bind-D1nO6fiC.js → bind-D_sZSVA3.js} +22 -10
- package/dist/{body-CH5of8Ne.js → body-CJQwYVa8.js} +3 -3
- package/dist/{body-text-QcXok_SI.js → body-text-DQhcmqdY.js} +8 -4
- package/dist/{boundary-BM8a_P6E.js → boundary-BV3O1eud.js} +8 -2
- package/dist/{boundary-BmHxVH1J.d.ts → boundary-C9ck-3uK.d.ts} +13 -4
- package/dist/{budget-NbEtbJC_.js → budget-BELja5A9.js} +6 -3
- package/dist/{budget-JqcRqyhK.d.ts → budget-hYsPz_yE.d.ts} +6 -3
- package/dist/{build-instance-DxE7czo9.js → build-instance-CNWaYJyr.js} +3 -3
- package/dist/{capability-L7NnfhiE.js → capability-BqX94r07.js} +31 -25
- package/dist/{capability-D4UC9TTW.d.ts → capability-ChuiONQU.d.ts} +41 -29
- package/dist/{casbin-BW9pS47J.js → casbin-H0rKxBx2.js} +16 -8
- package/dist/{casbin-BHijLuHY.js → casbin-cbSbhT_k.js} +2 -2
- package/dist/{casl-CmJlgziS.js → casl-C4OINZHI.js} +2 -2
- package/dist/{casl-UbI8v-Wq.js → casl-CHHoCldP.js} +19 -10
- package/dist/catalog/index.d.ts +51 -30
- package/dist/catalog/index.js +18 -15
- package/dist/{catalog-D69WhFii.js → catalog-BFpz2EmT.js} +20 -19
- package/dist/{catalog-BaMQfQ6Y.js → catalog-DCspHDc8.js} +3 -3
- package/dist/{catalog-doc-CV9s6B1S.js → catalog-doc-DjMKzJp9.js} +28 -14
- package/dist/{catalog-fingerprint-C144oW4M.js → catalog-fingerprint-e6aCWosn.js} +18 -14
- package/dist/catalog-mRQQQhNK.js +1 -0
- package/dist/catalog-operations-Dadrl7Z-.js +60 -0
- package/dist/{challenge-nGWma08S.js → challenge-DImNcR7B.js} +48 -27
- package/dist/chat/index.d.ts +1 -1
- package/dist/chat/index.js +13 -10
- package/dist/chat-sdk/index.d.ts +44 -26
- package/dist/chat-sdk/index.js +17 -17
- package/dist/{checks-BC_0mPIq.js → checks-CGkP3Z7A.js} +4 -1
- package/dist/{claims-map-7oQ3ue4X.js → claims-map-CKkoAAYF.js} +5 -2
- package/dist/{claims-map-Ca-QX8C6.d.ts → claims-map-D1Pb5oRq.d.ts} +8 -5
- package/dist/claude-agent/index.d.ts +6 -6
- package/dist/claude-agent/index.js +6 -3
- package/dist/clerk/index.d.ts +11 -7
- package/dist/clerk/index.js +6 -6
- package/dist/cli/bin.js +4 -4
- package/dist/cli/index.d.ts +82 -7
- package/dist/cli/index.js +6 -6
- package/dist/{clients-C7zLFuWT.d.ts → clients-C_NOET3z.d.ts} +5 -5
- package/dist/{clients-DjU5ABMy.js → clients-DYr3U86j.js} +3 -3
- package/dist/cloud/index.d.ts +84 -52
- package/dist/cloud/index.js +53 -39
- package/dist/{cloud-CO8pYtwr.js → cloud-BFlGMaak.js} +4 -5
- package/dist/{codemod-i4N2BhDc.js → codemod-DLQ9Zpo4.js} +3 -4
- package/dist/{codemod-BP6n8N9L.js → codemod-DWSN2erG.js} +523 -201
- package/dist/collect-B5BL3klN.js +1 -0
- package/dist/{collect-BaWeMjwV.js → collect-B7ZFAJU3.js} +26 -63
- package/dist/{collect-DNm3oKOk.js → collect-Bzv3le0A.js} +4 -5
- package/dist/{compare-pfyVnBjE.js → compare-DTfyUunF.js} +2 -2
- package/dist/compile/index.d.ts +2 -2
- package/dist/compile/index.js +1 -1
- package/dist/{compile-COM2VKuN.d.ts → compile-BFzysW3o.d.ts} +36 -12
- package/dist/{compile-BAEO5bOk.js → compile-EzEMB-7v.js} +77 -33
- package/dist/{completion-BNdVf7X2.js → completion-saoYiRFO.js} +17 -8
- package/dist/config-BwPBfN0t.js +108 -0
- package/dist/{config-DGZzMV1B.js → config-DBeXXmBF.js} +2 -2
- package/dist/{config-report-Cm7UITNA.js → config-report-BipSWA6V.js} +9 -6
- package/dist/config-shape-ykV0Vm2n.js +134 -0
- package/dist/{connection-DjhIJSs2.js → connection-B72dg5Q2.js} +23 -22
- package/dist/{connector-schema-_VCSsdtD.js → connector-schema-CYLQNMYq.js} +3 -2
- package/dist/{context--uM9V3Ui.js → context-BnIzxTNE.js} +4 -3
- package/dist/convex/index.d.ts +13 -7
- package/dist/convex/index.js +9 -6
- package/dist/{core-B5-w6Kw9.js → core-H-mbhpZc.js} +26 -20
- package/dist/{core-CQkE8Esr.d.ts → core-hWIARPDz.d.ts} +49 -22
- package/dist/{create-UTnUVETj.d.ts → create-BSNrVuxh.d.ts} +70 -37
- package/dist/{create-B2-CQqCI.d.ts → create-BVq1lNQE.d.ts} +49 -28
- package/dist/{create-QHuuPw3q.d.ts → create-CM1FciYG.d.ts} +37 -29
- package/dist/{create-Cb86Z8Im.js → create-Cq4Uox0f.js} +10 -7
- package/dist/{create-DJrlhEp9.js → create-_noSrY1T.js} +15 -21
- package/dist/{credential-CIM7wHwA.js → credential-CyyyvCsL.js} +41 -38
- package/dist/{credentials-BpuTwd7a.js → credentials-CdDxp7jN.js} +6 -6
- package/dist/{deciding-columns-DRo2QM6E.js → deciding-columns-NB4wcyBf.js} +2 -2
- package/dist/{delegation-C5rOdTp5.js → delegation-CDB6_keF.js} +31 -22
- package/dist/delivery/index.d.ts +4 -4
- package/dist/delivery/index.js +5 -5
- package/dist/{delivery-rwOKLWRm.js → delivery-BupfvJIV.js} +34 -22
- package/dist/{delivery-event-xX4obB8F.js → delivery-event-JioK5YbS.js} +6 -6
- package/dist/denied-text-CHNlVInN.d.ts +22 -0
- package/dist/{describe-DZlnEtLy.js → describe-Bb4hGK5d.js} +5 -5
- package/dist/{describe-O0SwYIK8.d.ts → describe-ByS9LgHK.d.ts} +5 -5
- package/dist/{device-BARQ8eYG.js → device-BwbJNmb2.js} +11 -8
- package/dist/{diff-Btr1c1Ow.js → diff-CN8IYhC_.js} +2 -2
- package/dist/{diff-DzT-xD13.js → diff-iZWV65nC.js} +22 -13
- package/dist/{digest-B3kc_PgQ.d.ts → digest-8Yx2CchM.d.ts} +3 -3
- package/dist/{doctor-BU1szn63.js → doctor-CHD1M9R5.js} +287 -135
- package/dist/{doctor-BoK_y0KO.js → doctor-D3wo-yuz.js} +4 -4
- package/dist/drizzle/index.d.ts +33 -19
- package/dist/drizzle/index.js +17 -9
- package/dist/elysia/index.d.ts +17 -11
- package/dist/elysia/index.js +5 -5
- package/dist/{errors-BKy0EfhN.js → errors-B6R_lg2a.js} +13 -4
- package/dist/{errors-BWXBMaKK.d.ts → errors-CHwoRRpB.d.ts} +4 -1
- package/dist/{errors-DpP_U6Bf.js → errors-Vpu6rKHl.js} +13 -10
- package/dist/{errors-B_Qg9D3e.d.ts → errors-zi_4T-rx.d.ts} +22 -6
- package/dist/{evaluate-B_oqFbWC.js → evaluate-Dd8Ta0Ie.js} +140 -78
- package/dist/{evaluations-DReoiVBw.js → evaluations-IBceAeKT.js} +40 -19
- package/dist/{evaluations-BCddEOfO.d.ts → evaluations-z8dQFDaN.d.ts} +11 -5
- package/dist/eve/index.d.ts +9 -6
- package/dist/eve/index.js +4 -4
- package/dist/{event-time-CsegxXxB.js → event-time-BGy48400.js} +8 -4
- package/dist/{expiry-D4_YKRKD.js → expiry-6XByK0dm.js} +8 -5
- package/dist/express/index.d.ts +9 -6
- package/dist/express/index.js +9 -6
- package/dist/fastify/index.d.ts +16 -10
- package/dist/fastify/index.js +8 -5
- package/dist/{fetch-adapter-CuhyYwC1.d.ts → fetch-adapter-C1DCvpqV.d.ts} +9 -6
- package/dist/{fetch-adapter-De-u6vhJ.js → fetch-adapter-JL43jD3E.js} +14 -11
- package/dist/fields-D0vUI6dq.js +498 -0
- package/dist/{files-acUbNwWt.js → files-B3AA05f1.js} +8 -5
- package/dist/{files-D_JIzUrP.js → files-BSjrtIHw.js} +11 -4
- package/dist/{fixtures-BTMW6zgU.js → fixtures-A1_sp_tR.js} +15 -6
- package/dist/{flags-aaeRAdiD.js → flags-DXjoTVbS.js} +2 -2
- package/dist/{freeze-CrU8nQeX.js → freeze-jjan0lCv.js} +4 -1
- package/dist/{from-snapshot-Bz469dIh.js → from-snapshot-DCakWRsr.js} +18 -15
- package/dist/gen-B5kvbAoZ.js +58 -0
- package/dist/gen-DWCYcMQM.js +827 -0
- package/dist/{generate-3FNO5P5Q.js → generate-CRVV5V7l.js} +14 -8
- package/dist/generate-CezbCaTI.js +275 -0
- package/dist/{grantee-BrRANrpT.js → grantee-Dke-9rd1.js} +4 -4
- package/dist/{grantee-conditions-C6P1Tvol.js → grantee-conditions-BrYPe-w0.js} +12 -12
- package/dist/{grantee-match-0RtHWQDx.js → grantee-match-7RZZvoT_.js} +12 -6
- package/dist/{graph-sql-B-dsAT6j.d.ts → graph-sql-BwFC4Qjs.d.ts} +3 -3
- package/dist/h3/index.d.ts +10 -7
- package/dist/h3/index.js +3 -3
- package/dist/headers-B9jQxjtW.d.ts +10 -0
- package/dist/{helpers-DY3vXuGs.js → helpers-DJicaG6f.js} +40 -28
- package/dist/hono/index.d.ts +16 -10
- package/dist/hono/index.js +5 -5
- package/dist/{hosted-BmjzxQhp.d.ts → hosted-Cmtxogd0.d.ts} +33 -21
- package/dist/{hosted-XBgU6RGT.js → hosted-D0IzESu_.js} +42 -21
- package/dist/{http-ujKm0JXE.js → http-DH94eh6f.js} +4 -4
- package/dist/{http-BBoKefeS.js → http-DKLXrFGk.js} +13 -7
- package/dist/{http-Ca3Sr5x1.js → http-DOL33cO0.js} +11 -8
- package/dist/{import-Bz0GefWg.js → import-CST57XLp.js} +64 -51
- package/dist/{import-DB2EG_iy.js → import-_YqhhwvX.js} +6 -6
- package/dist/{index-BSfRl0hZ.d.ts → index-B8s204GL.d.ts} +64 -52
- package/dist/{index-DH9DUDEM.d.ts → index-BT5-1VsX.d.ts} +54 -30
- package/dist/{index-BTkwrK7v.d.ts → index-BW_0MZOS.d.ts} +282 -172
- package/dist/{index-CMiPH2Tv.d.ts → index-BhxEUY9J.d.ts} +64 -37
- package/dist/{index-DLwcuCN_.d.ts → index-Bv5iXPqU.d.ts} +51 -30
- package/dist/{index-BE8y3moU.d.ts → index-_9UiQIkt.d.ts} +127 -82
- package/dist/index.d.ts +22 -22
- package/dist/index.js +33 -33
- package/dist/{init-5TXNji88.js → init-Dz_PsHdv.js} +5 -5
- package/dist/{init-B-4t1NzC.js → init-cE3A8aXq.js} +10 -10
- package/dist/{instance-options-CU0YQCLH.d.ts → instance-options-B0KXqTrJ.d.ts} +4 -4
- package/dist/{instance-snapshot-CjcwnEiV.js → instance-snapshot--JWiTrvO.js} +75 -55
- package/dist/{instant-BluqDvyS.js → instant-DK3Iz83e.js} +2 -2
- package/dist/{internals-Dk8A8fX3.js → internals-B3IgHrvo.js} +6 -3
- package/dist/{json-schema-B-vAwlde.js → json-schema-BPGa-RjQ.js} +9 -3
- package/dist/{json-schema-CN_iLFH2.d.ts → json-schema-BfXgnRNT.d.ts} +4 -4
- package/dist/jwt/index.d.ts +57 -27
- package/dist/jwt/index.js +24 -21
- package/dist/{kernel-DVExUwkp.js → kernel-C-fYydV2.js} +32 -23
- package/dist/kysely/index.d.ts +49 -33
- package/dist/kysely/index.js +9 -7
- package/dist/{live-options-BaAFCIiu.js → live-options-BBIT68le.js} +2 -2
- package/dist/{load-DxroEzH1.js → load-DjSU5KXO.js} +6 -6
- package/dist/load-Dm0pSYH3.js +1 -0
- package/dist/{login-ClSJh5t5.js → login-D-8tMqzo.js} +4 -4
- package/dist/{login-WC9HPJpU.js → login-DplQ0s84.js} +16 -9
- package/dist/{manifest-Dv6q4i5s.js → manifest-Cgiq5oqc.js} +49 -38
- package/dist/{manifest-BVhExYhw.d.ts → manifest-CzzWtnAb.d.ts} +126 -31
- package/dist/{manifest-schema-Cv492Qev.js → manifest-schema-2r37XRhD.js} +44 -3
- package/dist/{manifest-B79YuF2T.js → manifest-wg8WkkpD.js} +6 -6
- package/dist/{map-claims-etGIS_Dv.js → map-claims-BNWCJtmP.js} +14 -8
- package/dist/{map-error-BQGyDm_M.js → map-error-pasIGqMT.js} +7 -7
- package/dist/{markers-C6joDI3o.js → markers-BeHZ4x9Q.js} +20 -5
- package/dist/mcp/index.d.ts +114 -61
- package/dist/mcp/index.js +70 -40
- package/dist/{migrate-Dodel0IJ.js → migrate-B7oP_sQU.js} +35 -17
- package/dist/module-values-BJTBdo6y.js +107 -0
- package/dist/nest/index.d.ts +23 -13
- package/dist/nest/index.js +18 -11
- package/dist/next/client.d.ts +5 -2
- package/dist/next/client.js +1 -1
- package/dist/next/index.d.ts +72 -26
- package/dist/next/index.js +110 -6
- package/dist/next/plugin.d.ts +1 -1
- package/dist/next/plugin.js +4 -3
- package/dist/node/index.d.ts +5 -5
- package/dist/node/index.js +3 -3
- package/dist/{ocsf-BFp-PZZA.js → ocsf-TcjRBgIs.js} +15 -5
- package/dist/openai/index.d.ts +13 -7
- package/dist/openai/index.js +3 -3
- package/dist/openapi/index.d.ts +51 -30
- package/dist/openapi/index.js +2 -2
- package/dist/{openapi-Ddb4628T.js → openapi-BOsx0xn9.js} +33 -18
- package/dist/{openapi-DMocl1bh.js → openapi-CBZUhA3l.js} +4 -5
- package/dist/{openapi-ztVaux6j.js → openapi-VeHHU2l9.js} +23 -14
- package/dist/{operation-findings-kRcEp8lE.js → operation-findings-CXtFzlKJ.js} +3 -3
- package/dist/{operations-BNLes61x.d.ts → operations-Ci_rT6Uo.d.ts} +10 -7
- package/dist/orpc/index.d.ts +68 -14
- package/dist/orpc/index.js +62 -13
- package/dist/otel/index.d.ts +7 -4
- package/dist/otel/index.js +8 -5
- package/dist/output-files-BHOIlrfD.js +1 -0
- package/dist/{output-files-CCMdcFWb.js → output-files-BIQ_9pIs.js} +29 -17
- package/dist/{output-DgSDLrta.js → output-tkju6U7R.js} +9 -5
- package/dist/ownership-B4L59T9u.js +1054 -0
- package/dist/{parse-Ddhz2xf4.js → parse-1_ZheTW5.js} +16 -13
- package/dist/parse-local-manifest-BQhTlLQS.d.ts +10 -0
- package/dist/{parse-local-manifest-T1Q8X3A2.js → parse-local-manifest-DEiCF4ah.js} +19 -7
- package/dist/{parse-request-D_tUXG6M.js → parse-request-CwCZpyjV.js} +7 -8
- package/dist/{paths-DXSHAMIa.js → paths-CUvURzHp.js} +4 -1
- package/dist/pdp/index.d.ts +9 -6
- package/dist/pdp/index.js +20 -13
- package/dist/{peer-DOzzMfZL.js → peer-C9LvBCcb.js} +1 -1
- package/dist/{peer-12Q5I_RH.js → peer-Q0fuZ6hx.js} +9 -3
- package/dist/{permdock-Dco6dyCK.d.ts → permdock-B6Sf4T_S.d.ts} +253 -129
- package/dist/{permdock-BfWEeMqk.js → permdock-L-_I_3zP.js} +59 -35
- package/dist/{permission-registry-DpPtSKNZ.js → permission-registry-B8tYxPIt.js} +23 -10
- package/dist/{permission-types-DhNEmoRG.d.ts → permission-types-CAY-GU7e.d.ts} +127 -41
- package/dist/{permissions-CoqCOfJ3.d.ts → permissions-Bx6UI8n1.d.ts} +6 -3
- package/dist/{permissions-CyH2MV_B.js → permissions-CVXmRILq.js} +3 -3
- package/dist/{permissions-DArULThq.js → permissions-mDcTWoBs.js} +8 -5
- package/dist/pg-DQTqRrou.js +60 -0
- package/dist/{pins-8ILTftC9.js → pins-nqarl3oE.js} +4 -1
- package/dist/{pkce-5h8NgMQJ.js → pkce-CnmmYqUZ.js} +1 -1
- package/dist/{policy-B7dg_yzu.d.ts → policy-Ba4bDhaj.d.ts} +5 -5
- package/dist/{policy-DaJy4nK4.js → policy-CLQ8__GF.js} +43 -23
- package/dist/{policy-from-catalog-DFWYkNdu.js → policy-from-catalog-CJgOm6aq.js} +28 -25
- package/dist/{policy-module-CTlwMvLI.js → policy-module-xym9fnSq.js} +12 -6
- package/dist/{policy-types-B-F-qAZk.d.ts → policy-types-CCiDRZBH.d.ts} +738 -349
- package/dist/{postgres-store-BL9M_CA1.js → postgres-store-DcyrPS-r.js} +43 -16
- package/dist/{postgrest-r5faDIzD.js → postgrest-D4nuPXIQ.js} +52 -33
- package/dist/{postgrest-CYacM_u7.d.ts → postgrest-DicQyqm-.d.ts} +54 -35
- package/dist/{powersync-53ryOZip.js → powersync-DHNQX06W.js} +127 -69
- package/dist/{powersync-13odBwiM.js → powersync-DXqGuq9A.js} +3 -3
- package/dist/powersync-Djf-zCpB.js +1 -0
- package/dist/preset/index.d.ts +38 -28
- package/dist/preset/index.js +1 -1
- package/dist/{preset-CHTbd-DQ.js → preset-BjLzeFpp.js} +56 -32
- package/dist/{principal-source-pHneukrx.js → principal-source-C6N60GtM.js} +10 -10
- package/dist/prisma/index.d.ts +69 -41
- package/dist/prisma/index.js +21 -17
- package/dist/{problem-CTviyH5L.js → problem-BVLHFK33.js} +41 -21
- package/dist/{problem-details-cn5X30gZ.js → problem-details-CLDgX1KV.js} +13 -4
- package/dist/{problem-types-CJ2325SZ.js → problem-types-DSsRfONQ.js} +4 -1
- package/dist/{prompt-DwtVemER.js → prompt-BYc6drYW.js} +4 -1
- package/dist/protected-action-BE7N_Luo.d.ts +58 -0
- package/dist/protected-action-DUYqb-Ma.js +80 -0
- package/dist/{protected-DXE3cQYg.js → protected-action-QEA8arRB.js} +48 -14
- package/dist/{provider-BQsTYYy0.js → provider-C55OGXJ7.js} +5 -4
- package/dist/{provider-Csk-THAn.d.ts → provider-DXfq5c2d.d.ts} +1 -1
- package/dist/{provider-store-IgqQipCO.js → provider-store-CaTv00tr.js} +13 -9
- package/dist/pull-B65ndFNZ.js +1 -0
- package/dist/{pull-CN5OLxrF.js → pull-CwpGaQSi.js} +12 -11
- package/dist/{push-tVdG8dUL.js → push-DgssgzkK.js} +19 -13
- package/dist/{pushed-policy-BbcY9r_4.d.ts → pushed-policy-D1Eoi6NM.d.ts} +12 -6
- package/dist/{pushed-policy-CmYeSQqq.js → pushed-policy-ITwYKvvH.js} +10 -7
- package/dist/react/index.d.ts +9 -8
- package/dist/react/index.js +7 -6
- package/dist/react/provider-client.d.ts +1 -1
- package/dist/react/provider-client.js +1 -1
- package/dist/react-native/index.d.ts +94 -55
- package/dist/react-native/index.js +200 -61
- package/dist/{refs-CNJBiTFo.js → refs-C8BKxc_e.js} +2 -2
- package/dist/{relation-walk-3OyDBF0S.js → relation-walk-DK_gkgL7.js} +12 -9
- package/dist/{relations-BnCWnJGI.js → relations-BxvRvDHK.js} +3 -3
- package/dist/{replay-Du1tJjG7.js → replay-BU09ad4L.js} +1 -1
- package/dist/{replay-DCDD_ZfL.d.ts → replay-DNftIb_R.d.ts} +1 -1
- package/dist/{request-context-BykKLmyE.js → request-context-C25ilqiJ.js} +8 -8
- package/dist/{request-schema-CMreVuFM.js → request-schema-DhX7UbfQ.js} +4 -1
- package/dist/resend/index.d.ts +34 -28
- package/dist/resend/index.js +29 -29
- package/dist/resolve-names-CF7xXLSG.js +201 -0
- package/dist/{resource-relations-D_jw0BFx.js → resource-relations-8-pCScBO.js} +18 -9
- package/dist/{retire-Wj6dkyDE.js → retire-B2xffQgY.js} +15 -6
- package/dist/{revocations-R07lFBnX.d.ts → revocations-BaUXHM1N.d.ts} +6 -3
- package/dist/{rls-CxBZb4rZ.js → rls-CNEH2_BG.js} +299 -124
- package/dist/{rls-Ck_PocSp.js → rls-Ca8Jz9b5.js} +13 -6
- package/dist/{role-builder-C1VJzvcr.js → role-builder-BK2-T6oD.js} +41 -20
- package/dist/{row-conditions-h2HythXQ.js → row-conditions-BAGHOmVq.js} +4 -3
- package/dist/{rpc-Bk1bE-ch.js → rpc-fNqAIqQk.js} +8 -5
- package/dist/{run-uLD2aWuO.js → run-Bz26OTfO.js} +26 -23
- package/dist/run-D-JE8QWb.js +1 -0
- package/dist/{run-ticket-BpNi7BCi.d.ts → run-ticket-DbWI9f99.d.ts} +29 -14
- package/dist/{run-ticket-B5d_63Ma.js → run-ticket-Dv7aF7Dk.js} +9 -9
- package/dist/{runtime-Vif3_-zf.js → runtime-BGnrOkVH.js} +5 -2
- package/dist/{saas-Az_Kz-4D.js → saas-iWnUdwCt.js} +42 -29
- package/dist/{scan-DSljDE1Y.js → scan-DCj1KQfn.js} +1 -1
- package/dist/{schema-B4v0Qrac.js → schema-BOJjqlWL.js} +3 -2
- package/dist/{schema-gIcCx7zM.js → schema-Dst9I9Gs.js} +8 -4
- package/dist/scim/index.d.ts +2 -2
- package/dist/scim/index.js +2 -2
- package/dist/{scim-C7JYhySg.js → scim-D8YupzX1.js} +2 -2
- package/dist/{scim-YNieBO1U.js → scim-jJBJ7g1Z.js} +33 -15
- package/dist/{scopes-BHsc-wp-.js → scopes-0Up_UA2t.js} +41 -23
- package/dist/server/index.d.ts +11 -11
- package/dist/server/index.js +12 -12
- package/dist/{server-Bnga6I50.js → server-3cVlTLde.js} +31 -31
- package/dist/{server-types-C4gZUEZy.d.ts → server-types-CIlpSA2G.d.ts} +81 -46
- package/dist/{sha256-D9ihqmvd.js → sha256-C-4WXKIu.js} +4 -3
- package/dist/{shared-fMKOv8hP.js → shared-Afctg7B0.js} +65 -32
- package/dist/{shared-C8LjUdVU.js → shared-l0oGGetg.js} +9 -6
- package/dist/{signals-D3NcTKUS.js → signals-B1vHR3fN.js} +2 -2
- package/dist/{sink-BEZSlMS_.js → sink-D9_vh372.js} +32 -21
- package/dist/{sink-Cp_Eot9W.d.ts → sink-Dvi7YZG_.d.ts} +44 -20
- package/dist/{skills-Dcjw9_1C.js → skills-Bjj7BNEQ.js} +12 -8
- package/dist/{skills-g_3BS9NC.js → skills-OuoMR49L.js} +3 -3
- package/dist/{snapshot-CbGmYiJx.js → snapshot-CXlzi69u.js} +21 -18
- package/dist/{snapshot-cache-Pahd3IYJ.d.ts → snapshot-cache-BAXZ0KOp.d.ts} +21 -12
- package/dist/{snapshot-cache-DT2Kx1F8.js → snapshot-cache-Bx_4xC_6.js} +14 -11
- package/dist/solid/index.d.ts +55 -16
- package/dist/solid/index.js +46 -12
- package/dist/solid-start/index.d.ts +30 -12
- package/dist/solid-start/index.js +3 -3
- package/dist/{sources-DEEuGb8S.d.ts → sources-B1Os_YUu.d.ts} +126 -53
- package/dist/{sources-B-zYB4GS.js → sources-CMAM-2A3.js} +46 -27
- package/dist/{sql-B96movIM.js → sql-0WjxIp9g.js} +28 -7
- package/dist/{sql-CDEPCA0g.d.ts → sql-B80DFdpG.d.ts} +2 -2
- package/dist/{src-DLFrtrrC.js → src-DZ0l9UAg.js} +190 -100
- package/dist/ssf/index.d.ts +3 -3
- package/dist/ssf/index.js +47 -35
- package/dist/{standard-webhooks-B_qRg0ws.d.ts → standard-webhooks-C-qX4mJW.d.ts} +7 -7
- package/dist/{standard-webhooks-DgFFD-Ga.js → standard-webhooks-D67a3nzk.js} +5 -5
- package/dist/{store-DSP9oGvh.js → store-RNFvaJJv.js} +32 -26
- package/dist/{store-options-B_poyYvg.js → store-options-Dil3lraY.js} +105 -15
- package/dist/stores-C0Kta5Ft.d.ts +59 -0
- package/dist/{stores-BqEuHC05.js → stores-DxZWDXCs.js} +42 -5
- package/dist/{stream-CvdUS9V1.js → stream-CDvF0sJm.js} +5 -5
- package/dist/{stream-2Vwhl7Er.d.ts → stream-ltuLdtTG.d.ts} +4 -3
- package/dist/{style-Ds1gNm77.js → style-DblOtSga.js} +1 -1
- package/dist/{style-Cqo7-73x.js → style-Ds11Hmk4.js} +2 -1
- package/dist/{subject-settings-CkEwrw3W.js → subject-settings-8sH5HlII.js} +8 -4
- package/dist/{row-check-Dt35czLy.d.ts → subject-settings-vNW8qmUH.d.ts} +30 -18
- package/dist/supabase/index.d.ts +48 -38
- package/dist/supabase/index.js +5 -5
- package/dist/supabase/middleware.d.ts +19 -13
- package/dist/supabase/middleware.js +7 -7
- package/dist/{supabase--0aJdLEd.js → supabase-BL1qJzzY.js} +79 -35
- package/dist/{supabase-Bqp7iIY2.js → supabase-D39cuGPt.js} +3 -3
- package/dist/{supabase-hook-Dg0SrQWR.js → supabase-hook-B-yXnzUl.js} +175 -196
- package/dist/supabase-hook-H-MtE9Wd.js +1 -0
- package/dist/{supautils-MESd81bF.js → supautils-BU-pAEpf.js} +166 -47
- package/dist/{support-session-Cna49-3f.js → support-session-BsmPCbz8.js} +21 -21
- package/dist/svelte/PermissionBoundary.svelte +2 -6
- package/dist/svelte/Protected.svelte +2 -8
- package/dist/svelte/index.d.ts +9 -8
- package/dist/svelte/index.js +10 -9
- package/dist/svelte/runtime.d.ts +4 -4
- package/dist/svelte/runtime.js +4 -4
- package/dist/svelte/source.d.ts +9 -8
- package/dist/svelte/source.js +6 -5
- package/dist/sveltekit/index.d.ts +30 -12
- package/dist/sveltekit/index.js +2 -2
- package/dist/{ownership-Z2LpxsGa.js → tables-DeMNEy6V.js} +641 -1104
- package/dist/tanstack-start/index.d.ts +22 -10
- package/dist/tanstack-start/index.js +2 -2
- package/dist/{target-Bw37TFNA.js → target-qdEAnnhU.js} +6 -6
- package/dist/{tenancy-CmeBQ6Nv.js → tenancy-5d1zVBvK.js} +25 -19
- package/dist/terminal/index.d.ts +23 -14
- package/dist/terminal/index.js +17 -20
- package/dist/testing/core.d.ts +1 -1
- package/dist/testing/core.js +1 -1
- package/dist/testing/fixtures/index.d.ts +8 -5
- package/dist/testing/fixtures/index.js +78 -17
- package/dist/testing/index.d.ts +224 -141
- package/dist/testing/index.js +299 -234
- package/dist/testing/saas/index.d.ts +43 -27
- 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 → text-diff-BtfSmdUo.js} +2 -2
- package/dist/{thenable-yD7SabqG.js → thenable-BNSM1U2R.js} +12 -3
- package/dist/{time-DkWjdL98.js → time-nR1JesoH.js} +32 -8
- package/dist/{token-2qYDvXz2.js → token-DC9EQiet.js} +14 -12
- package/dist/{tool-refusal-reAhIzdl.js → tool-refusal-Qpjs_W6M.js} +5 -2
- package/dist/trpc/index.d.ts +11 -8
- package/dist/trpc/index.js +15 -9
- package/dist/type-helpers-BIPIDa6a.d.ts +50 -0
- package/dist/{types-DBHftjgS.d.ts → types-AMJ5qoU_.d.ts} +45 -33
- package/dist/{types-CfiKC5aN.d.ts → types-B2mlGuhW.d.ts} +14 -11
- package/dist/{types-D3A19w4A.d.ts → types-B4uqKDnp.d.ts} +22 -13
- package/dist/{types-CQVEQawv.d.ts → types-BJk0BKRX.d.ts} +24 -14
- package/dist/types-B_d_g7T3.d.ts +262 -0
- package/dist/{types-DC44-hqb.d.ts → types-B_tiYvk8.d.ts} +59 -32
- package/dist/{types-DqzsnlSA.js → types-CcUXciSj.js} +17 -5
- package/dist/{types-BWZybqs9.d.ts → types-DC1Loeh3.d.ts} +381 -202
- package/dist/{types-CIeZcG8v.d.ts → types-DHKPcqzr.d.ts} +2 -2
- package/dist/{types-cTos-H7p.d.ts → types-DjuMBNF9.d.ts} +68 -32
- package/dist/{types-CeIscIKp.d.ts → types-HzqOtvsJ.d.ts} +23 -12
- package/dist/{types-BXMYB7BY.d.ts → types-ZzRGoViD.d.ts} +77 -24
- package/dist/{types-BfVmNJO5.d.ts → types-ah9NlU6j.d.ts} +128 -50
- package/dist/{types-DXmwu78Z.d.ts → types-djVzLlIV.d.ts} +31 -14
- package/dist/{types-g7Oy6Zg4.d.ts → types-yUuPR5Hy.d.ts} +47 -24
- package/dist/unplugin/index.d.ts +1 -1
- package/dist/unplugin/index.js +2 -2
- package/dist/usage-CYeXek0p.js +1 -0
- package/dist/{usage-Bybmck7f.js → usage-CxEzS4ey.js} +50 -26
- package/dist/{usage-CDaLXCfL.js → usage-ab0PdusX.js} +2 -2
- package/dist/{validation-error-ZfUHbKvf.js → validation-error-CYg2kJEw.js} +4 -1
- package/dist/{validation-error-CQpoquwj.d.ts → validation-error-YGg2mXyH.d.ts} +5 -2
- package/dist/{validity-CZ7-y0Cj.js → validity-Buc7w8E9.js} +13 -10
- package/dist/{verifier-DHuh-okk.js → verifier-DUV6pLqZ.js} +10 -4
- package/dist/{verify-pe8rL_Qw.js → verify-DZeqoWu5.js} +148 -487
- package/dist/version-DMQ0dnN5.js +48 -0
- package/dist/version-DizhmD72.js +1 -0
- package/dist/{views-BB8E9dTP.js → views-CD8wuL4Z.js} +19 -6
- package/dist/{vocabulary-Bg3eeT2H.d.ts → vocabulary-DEJ5j4mR.d.ts} +7 -4
- package/dist/vue/index.d.ts +71 -22
- package/dist/vue/index.js +50 -13
- package/dist/{waiter-DwEyouan.d.ts → waiter-Bu9zAlE0.d.ts} +13 -10
- package/dist/{waiter-BGUtGYoU.js → waiter-aBLM63_f.js} +1 -1
- package/dist/{watch-C-4VmFlL.js → watch-Cx_WciLE.js} +8 -8
- package/dist/watch-DB42U1ib.js +1 -0
- package/dist/webmcp/index.d.ts +11 -11
- package/dist/webmcp/index.js +8 -5
- package/dist/{where-scope-wq2coopv.js → where-scope-DlCdCM_8.js} +24 -18
- package/dist/{who-can-BwNsI_Js.js → who-can-rI7dCR9Q.js} +23 -20
- package/dist/workflow/index.d.ts +3 -3
- package/dist/workflow/index.js +13 -13
- package/dist/workflow-sdk/index.d.ts +19 -13
- package/dist/workflow-sdk/index.js +6 -6
- package/dist/{wrap-CiSc_KCq.js → wrap-B2wziJI_.js} +4 -4
- package/dist/{wrap-B6R0cMRL.d.ts → wrap-DlJE3gS_.d.ts} +8 -5
- package/package.json +7 -7
- package/schemas/catalog-v1.json +3 -0
- package/schemas/supabase-manifest-v1.json +33 -1
- package/skills/permdock-credentials/references/tokens-keys-links.md +8 -6
- package/skills/permdock-data/references/queries-and-rls.md +2 -1
- package/skills/permdock-tenancy/references/ownership-and-custom-roles.md +2 -2
- package/skills/permdock-wire/references/adapters.md +14 -22
- package/dist/catalog-BCCjSAdH.js +0 -1
- package/dist/collect-k_Dulxr5.js +0 -1
- package/dist/config-CoQHDrDi.js +0 -166
- package/dist/denied-text-D4qkEtFz.d.ts +0 -19
- package/dist/fields-ClcQLrVc.js +0 -238
- package/dist/generate-CNU1pIOo.js +0 -171
- package/dist/headers-BIjfMaoC.js +0 -8
- package/dist/headers-CIbDTUTK.d.ts +0 -7
- package/dist/load-DrMHXzgN.js +0 -1
- package/dist/output-files-DPAY7-GX.js +0 -1
- package/dist/package-root-Dk_ETdkp.js +0 -31
- package/dist/parse-local-manifest-e4mdwAKd.d.ts +0 -10
- package/dist/policies-B2lZIurj.js +0 -295
- package/dist/powersync-CExtTLyA.js +0 -1
- package/dist/problem-details-Tcfmj3bV.d.ts +0 -7
- package/dist/protected-BwZYL1X_.d.ts +0 -39
- package/dist/pull-Cty6Ovyu.js +0 -1
- package/dist/run-Bz7DXGEv.js +0 -1
- package/dist/stores-BAZwSYZA.d.ts +0 -31
- package/dist/supabase-hook-DJxC4PoP.js +0 -1
- package/dist/types-CKV71kKh.d.ts +0 -172
- package/dist/usage-y-kBNdqs.js +0 -1
- package/dist/version-CEbQ5UeM.js +0 -18
- package/dist/version-DXkYUISx.js +0 -1
- package/dist/watch-Bd9mx3rd.js +0 -1
|
@@ -1,27 +1,30 @@
|
|
|
1
1
|
import { r as isRecord } from "./compact-CAf557ZB.js";
|
|
2
|
-
import { o as hasConditionOp } from "./refs-
|
|
3
|
-
import { f as scopeList, l as rootScope, s as resolveScope, u as scopeChain } from "./scopes-
|
|
4
|
-
import { t as APPROVAL_REQUEST_SCHEMA } from "./request-schema-
|
|
5
|
-
import { a as describeError, i as configError } from "./errors-
|
|
6
|
-
import { i as readJsonFile, o as sqlFiles, s as writeFileEnsuringDir } from "./files-
|
|
7
|
-
import { a as SUPABASE_MANIFEST_SCHEMA } from "./version-
|
|
8
|
-
import { c as requirePolicy } from "./load-
|
|
9
|
-
import { i as qualifySqlTable } from "./sql-
|
|
10
|
-
import {
|
|
11
|
-
import { t as authorizeSql } from "./supabase
|
|
12
|
-
import "./budget-
|
|
13
|
-
import { a as hookApiNames, d as keptKeys, t as AUTHZ_VERSION_TABLE, u as roleManifest } from "./sources-
|
|
14
|
-
import { o as readMemberships } from "./postgrest-
|
|
2
|
+
import { o as hasConditionOp } from "./refs-C8BKxc_e.js";
|
|
3
|
+
import { f as scopeList, l as rootScope, s as resolveScope, u as scopeChain } from "./scopes-0Up_UA2t.js";
|
|
4
|
+
import { t as APPROVAL_REQUEST_SCHEMA } from "./request-schema-DhX7UbfQ.js";
|
|
5
|
+
import { a as describeError, i as configError } from "./errors-Vpu6rKHl.js";
|
|
6
|
+
import { i as readJsonFile, o as sqlFiles, s as writeFileEnsuringDir } from "./files-BSjrtIHw.js";
|
|
7
|
+
import { a as SUPABASE_MANIFEST_SCHEMA } from "./version-DMQ0dnN5.js";
|
|
8
|
+
import { c as requirePolicy } from "./load-DjSU5KXO.js";
|
|
9
|
+
import { i as qualifySqlTable } from "./sql-0WjxIp9g.js";
|
|
10
|
+
import { i as scopeColumn } from "./compile-EzEMB-7v.js";
|
|
11
|
+
import { t as authorizeSql } from "./supabase-BL1qJzzY.js";
|
|
12
|
+
import "./budget-BELja5A9.js";
|
|
13
|
+
import { a as hookApiNames, d as keptKeys, t as AUTHZ_VERSION_TABLE, u as roleManifest } from "./sources-CMAM-2A3.js";
|
|
14
|
+
import { o as readMemberships } from "./postgrest-D4nuPXIQ.js";
|
|
15
15
|
import { t as beforeFirst } from "./text-BMFRfBqc.js";
|
|
16
|
-
import { n as GRANTS_MARKER, r as HOOK_MARKER, s as hookMarkerFields } from "./markers-
|
|
16
|
+
import { n as GRANTS_MARKER, r as HOOK_MARKER, s as hookMarkerFields } from "./markers-BeHZ4x9Q.js";
|
|
17
17
|
import { n as formatManifestJson, t as MANIFEST_FILE } from "./manifest-json-CAGzls-C.js";
|
|
18
18
|
import { n as MIGRATION_DIRS } from "./constants-DcJABbLW.js";
|
|
19
|
-
import { f as writeOutputFiles, l as partPath, r as driftOf, u as pgDeltaPath } from "./output-files-
|
|
20
|
-
import { A as quoteQualified, D as qualified, F as
|
|
21
|
-
import {
|
|
19
|
+
import { f as writeOutputFiles, l as partPath, r as driftOf, u as pgDeltaPath } from "./output-files-BIQ_9pIs.js";
|
|
20
|
+
import { A as quoteQualified, D as qualified, F as firstScopeType, I as scopeTypeOf, O as quoteIdent, R as tenantTypeOf, a as customRolesOn, j as quoteTable, k as quoteLiteral, l as USER_ID_HELPER, r as HELPERS, y as subjectIdSql } from "./shared-Afctg7B0.js";
|
|
21
|
+
import { E as TOKEN_SCOPE_ALLOWS, J as apiKeyFields, K as API_KEY_ALLOWS, R as globalRoleSource, _ as PERMISSION_HELPERS, at as memberForHelper, b as permissionKeysForHelper, bt as checkSuspension, ct as memberIdsHelper, dt as permittedForHelper, et as hasMemberFor, ft as permittedIdsHelper, g as OWNERSHIP, h as ASSIGNMENTS, lt as memberOfHelper, ot as memberForSources, rt as isTeamScope, st as memberForTable, tt as hasPermittedUsers, ut as memberRoleOf, v as checkName, vt as activeRowSql, x as permittedByPermissionHelper } from "./tables-DeMNEy6V.js";
|
|
22
|
+
import { a as guardedTables, t as ownershipRules, u as roleNames } from "./ownership-B4L59T9u.js";
|
|
22
23
|
import { t as membershipSourcesOf } from "./sources-qoIJQrJv.js";
|
|
23
|
-
import { a as splitUndiffed, r as tableKey, t as decidingColumns } from "./deciding-columns-
|
|
24
|
-
import {
|
|
24
|
+
import { a as splitUndiffed, r as tableKey, t as decidingColumns } from "./deciding-columns-NB4wcyBf.js";
|
|
25
|
+
import { n as pgConnector } from "./pg-DQTqRrou.js";
|
|
26
|
+
import { r as permittedUsersHelper, t as resolveNames } from "./resolve-names-CF7xXLSG.js";
|
|
27
|
+
import { c as ACTOR_MAY_WRITE, f as readOnlyActorKinds } from "./fields-D0vUI6dq.js";
|
|
25
28
|
import { existsSync, readFileSync, readdirSync } from "node:fs";
|
|
26
29
|
import { dirname, join, posix, resolve } from "node:path";
|
|
27
30
|
//#region ../../node_modules/.pnpm/smol-toml@1.9.1/node_modules/smol-toml/dist/error.js
|
|
@@ -822,7 +825,7 @@ function resolveAuthorize(config, flags = {}) {
|
|
|
822
825
|
if (explicit !== void 0) return explicit;
|
|
823
826
|
if (rls?.membershipSources !== void 0 || flags.rbac === true) return "database";
|
|
824
827
|
const memberships = flags.memberships ?? rls?.memberships;
|
|
825
|
-
return
|
|
828
|
+
return Object.keys(memberships?.scopes ?? {}).length > 0 ? "database" : "jwt";
|
|
826
829
|
}
|
|
827
830
|
function parseRbacAuthorize(raw) {
|
|
828
831
|
if (raw === void 0) return;
|
|
@@ -839,7 +842,10 @@ function createEnum(schema, name, values) {
|
|
|
839
842
|
exception when duplicate_object then null;
|
|
840
843
|
end $$;`;
|
|
841
844
|
}
|
|
842
|
-
/**
|
|
845
|
+
/**
|
|
846
|
+
* A read policy and `select` grant for `supabase_auth_admin` on a table the
|
|
847
|
+
* hook reads.
|
|
848
|
+
*/
|
|
843
849
|
function authAdminRead(table, label) {
|
|
844
850
|
const t = quoteQualified(table);
|
|
845
851
|
const policy = quoteIdent(`permdock_auth_admin_read_${label}`);
|
|
@@ -852,10 +858,10 @@ create policy ${policy} on ${t}
|
|
|
852
858
|
}
|
|
853
859
|
/**
|
|
854
860
|
* Supabase's Custom Claims and RBAC scaffold on top of the PermDock helpers:
|
|
855
|
-
* enums, `user_roles` and `authorize()` over the shared `role_permissions`.
|
|
856
|
-
*
|
|
857
|
-
*
|
|
858
|
-
*
|
|
861
|
+
* enums, `user_roles` and `authorize()` over the shared `role_permissions`. The
|
|
862
|
+
* token hook comes only from `permdock supabase hook generate`, so one function
|
|
863
|
+
* writes the claims. Policies never call `authorize()` per row; they call the
|
|
864
|
+
* helpers. Never grants anything to `service_role`.
|
|
859
865
|
*/
|
|
860
866
|
function rbacScaffold(policy, options) {
|
|
861
867
|
const schema = options.schema;
|
|
@@ -940,16 +946,25 @@ function readSupabaseConfig(cwd) {
|
|
|
940
946
|
}
|
|
941
947
|
};
|
|
942
948
|
}
|
|
943
|
-
/**
|
|
949
|
+
/**
|
|
950
|
+
* `supabase/` joined with `declarative_schema_path`, which defaults to
|
|
951
|
+
* `schemas`.
|
|
952
|
+
*/
|
|
944
953
|
function declarativeSchemaDir(schemaPath) {
|
|
945
954
|
return posix.join("supabase", typeof schemaPath === "string" ? schemaPath : "schemas").replace(/\/$/u, "");
|
|
946
955
|
}
|
|
947
|
-
/**
|
|
956
|
+
/**
|
|
957
|
+
* The parsed config, or `{}` when it is missing or does not parse (PD045
|
|
958
|
+
* reports that).
|
|
959
|
+
*/
|
|
948
960
|
function supabaseConfig(cwd) {
|
|
949
961
|
const read = readSupabaseConfig(cwd);
|
|
950
962
|
return read?.ok === true ? read.config : {};
|
|
951
963
|
}
|
|
952
|
-
/**
|
|
964
|
+
/**
|
|
965
|
+
* PD045: a `supabase/config.toml` the CLI cannot parse, so every check that
|
|
966
|
+
* reads it falls back to defaults.
|
|
967
|
+
*/
|
|
953
968
|
function pd045(cwd) {
|
|
954
969
|
const read = readSupabaseConfig(cwd);
|
|
955
970
|
if (read === void 0 || read.ok) return [];
|
|
@@ -961,9 +976,9 @@ function pd045(cwd) {
|
|
|
961
976
|
}];
|
|
962
977
|
}
|
|
963
978
|
/**
|
|
964
|
-
* PD074: `supabase.hook` is configured but `[auth.hook.custom_access_token]`
|
|
965
|
-
*
|
|
966
|
-
*
|
|
979
|
+
* PD074: `supabase.hook` is configured but `[auth.hook.custom_access_token]` in
|
|
980
|
+
* `supabase/config.toml` does not enable the generated function, so a local
|
|
981
|
+
* stack and every branch push issue tokens without memberships.
|
|
967
982
|
*/
|
|
968
983
|
function pd074(cwd, config) {
|
|
969
984
|
const hook = config.supabase?.hook;
|
|
@@ -1126,8 +1141,8 @@ const USER_EDITABLE = /^(raw_)?user_meta(_)?data$/iu;
|
|
|
1126
1141
|
/**
|
|
1127
1142
|
* Splits `supabase.hook.attrs` into table columns and `app_metadata` keys and
|
|
1128
1143
|
* lists what cannot be compiled: `user_metadata` (the user can edit it), a
|
|
1129
|
-
* direct `auth.users` column, an unsafe or prototype key, a duplicate key,
|
|
1130
|
-
*
|
|
1144
|
+
* direct `auth.users` column, an unsafe or prototype key, a duplicate key, or a
|
|
1145
|
+
* table column without a table.
|
|
1131
1146
|
*/
|
|
1132
1147
|
function attrsPlan(attrs) {
|
|
1133
1148
|
const errors = [];
|
|
@@ -1242,8 +1257,8 @@ function beforeSql(before) {
|
|
|
1242
1257
|
}
|
|
1243
1258
|
/**
|
|
1244
1259
|
* `hook.validate`: the claims the hook writes, dropped together when they do
|
|
1245
|
-
* not match `supabase-claims-v1.json`, so a bad claim denies instead of
|
|
1246
|
-
*
|
|
1260
|
+
* not match `supabase-claims-v1.json`, so a bad claim denies instead of failing
|
|
1261
|
+
* sign-in. `hook.claims` entries belong to other packages and stay.
|
|
1247
1262
|
*/
|
|
1248
1263
|
function validateSql(parts) {
|
|
1249
1264
|
if (parts.hook.validate !== true) return "";
|
|
@@ -1269,8 +1284,8 @@ grant usage on schema extensions to supabase_auth_admin;
|
|
|
1269
1284
|
grant execute on function extensions.jsonb_matches_schema(json, jsonb) to supabase_auth_admin;` : "";
|
|
1270
1285
|
}
|
|
1271
1286
|
/**
|
|
1272
|
-
* Fails the migration when a client role can write an `attrs` column: a
|
|
1273
|
-
*
|
|
1287
|
+
* Fails the migration when a client role can write an `attrs` column: a claim
|
|
1288
|
+
* the user can set is not a server-owned attribute.
|
|
1274
1289
|
*/
|
|
1275
1290
|
function attrsGuardSql(plan) {
|
|
1276
1291
|
if (plan?.table === void 0 || plan.columns.length === 0) return "";
|
|
@@ -1319,10 +1334,11 @@ function hookClaims(parts) {
|
|
|
1319
1334
|
//#region src/cli/sql/declarative.ts
|
|
1320
1335
|
/**
|
|
1321
1336
|
* A migration's SQL as a declarative schema file: pg-delta diffs the file
|
|
1322
|
-
* against the database itself, so a `drop trigger if exists` or
|
|
1323
|
-
*
|
|
1324
|
-
*
|
|
1325
|
-
* pg-delta has no `create or replace constraint trigger`. A policy keeps its
|
|
1337
|
+
* against the database itself, so a `drop trigger if exists` or `drop policy if
|
|
1338
|
+
* exists` before its `create` is an error, and a trigger is `create or replace
|
|
1339
|
+
* trigger`. A constraint trigger stays `create constraint trigger`, because
|
|
1340
|
+
* pg-delta has no `create or replace constraint trigger`. A policy keeps its
|
|
1341
|
+
* plain `create policy`.
|
|
1326
1342
|
*/
|
|
1327
1343
|
function declarativeSql(sql) {
|
|
1328
1344
|
return sql.replaceAll(/^drop (?:trigger|policy) if exists [^;\n]+;\n/gmu, "").replaceAll(/^create trigger /gmu, "create or replace trigger ");
|
|
@@ -1342,9 +1358,9 @@ function schemasRefusal(command, value) {
|
|
|
1342
1358
|
return value === void 0 || isSupabaseSchemas(value) ? void 0 : `${command} --schemas must be ${MODES.join(", ")} (got ${value})`;
|
|
1343
1359
|
}
|
|
1344
1360
|
/**
|
|
1345
|
-
* `--schemas`, else `supabase.schemas`, else `migra` when `config.toml`
|
|
1346
|
-
*
|
|
1347
|
-
*
|
|
1361
|
+
* `--schemas`, else `supabase.schemas`, else `migra` when `config.toml` sets
|
|
1362
|
+
* `[experimental.pgdelta] enabled = false`, else `pg-delta`: the default of new
|
|
1363
|
+
* Supabase projects and of the next Supabase CLI major.
|
|
1348
1364
|
*/
|
|
1349
1365
|
function resolveSchemas(cwd, config, flag) {
|
|
1350
1366
|
const toml = supabaseConfig(cwd).pgDelta;
|
|
@@ -1365,7 +1381,10 @@ const HELPER_NAME = /^(?:permdock_has|permitted_[a-z][a-z0-9_]*_ids|member_[a-z]
|
|
|
1365
1381
|
function escape(text) {
|
|
1366
1382
|
return text.replaceAll(/[.*+?^${}()|[\]\\]/gu, String.raw`\$&`);
|
|
1367
1383
|
}
|
|
1368
|
-
/**
|
|
1384
|
+
/**
|
|
1385
|
+
* The helper functions `sql` creates in `schema`; unqualified names count for
|
|
1386
|
+
* `public`.
|
|
1387
|
+
*/
|
|
1369
1388
|
function helpersDefined(sql, schema) {
|
|
1370
1389
|
const qualifier = schema === "public" ? String.raw`(?:(?:"public"|public)\.)?` : String.raw`(?:"${escape(schema)}"|${escape(schema)})\.`;
|
|
1371
1390
|
const create = new RegExp(String.raw`\bcreate\s+(?:or\s+replace\s+)?function\s+${qualifier}"?([a-z_][a-z0-9_]*)"?\s*\(`, "giu");
|
|
@@ -1377,9 +1396,9 @@ function helpersDefined(sql, schema) {
|
|
|
1377
1396
|
return names;
|
|
1378
1397
|
}
|
|
1379
1398
|
/**
|
|
1380
|
-
* SQL files that may hold the generated helpers: `rls.out` (else `rls.sql`;
|
|
1381
|
-
*
|
|
1382
|
-
*
|
|
1399
|
+
* SQL files that may hold the generated helpers: `rls.out` (else `rls.sql`; its
|
|
1400
|
+
* `helpers` part when it has `{part}`), the SQL files next to the hook, and the
|
|
1401
|
+
* migration folders, not the hook itself.
|
|
1383
1402
|
*/
|
|
1384
1403
|
function helperSources(cwd, config, hookOut) {
|
|
1385
1404
|
const hook = resolve(cwd, hookOut);
|
|
@@ -1412,7 +1431,10 @@ where n.nspname = $1 and p.proname = any($2::text[])`, [manifest.helpers.schema,
|
|
|
1412
1431
|
function missingHelpersMessage(manifest, missing) {
|
|
1413
1432
|
return `PD039 schema ${manifest.helpers.schema} has no ${missing.join(", ")}: the hook's claims are read by these helpers; run permdock rls generate and apply its migration`;
|
|
1414
1433
|
}
|
|
1415
|
-
/**
|
|
1434
|
+
/**
|
|
1435
|
+
* Bytes of JSON of each extra claim in the largest sample, for claims that pass
|
|
1436
|
+
* the budget.
|
|
1437
|
+
*/
|
|
1416
1438
|
function oversizedClaims(samples, manifest) {
|
|
1417
1439
|
const encoder = new TextEncoder();
|
|
1418
1440
|
const oversized = [];
|
|
@@ -1515,7 +1537,10 @@ function memberForPlan(input) {
|
|
|
1515
1537
|
memberships: [...entries.values()]
|
|
1516
1538
|
};
|
|
1517
1539
|
}
|
|
1518
|
-
/**
|
|
1540
|
+
/**
|
|
1541
|
+
* An `rls.memberships` table in the manifest's `tableMembershipSource` /
|
|
1542
|
+
* `junctionMembershipSource` shape, for scope `name`.
|
|
1543
|
+
*/
|
|
1519
1544
|
function mappedMembership(mapped, scopes, name) {
|
|
1520
1545
|
const id = scopeColumn(mapped, scopes, name) ?? "";
|
|
1521
1546
|
const within = {};
|
|
@@ -1620,12 +1645,12 @@ ${source.sql.select(`v_user_${String(index)}`).replaceAll(/^/gmu, " ")}
|
|
|
1620
1645
|
//#region src/cli/supabase-hook/api.ts
|
|
1621
1646
|
const SUBJECT_FOR = "subject_for";
|
|
1622
1647
|
/**
|
|
1623
|
-
* `subject_for(p_user uuid) returns jsonb`: what the hook would put in a
|
|
1624
|
-
*
|
|
1625
|
-
*
|
|
1626
|
-
*
|
|
1627
|
-
* subject for an acting user or a job from it. Naming the user is why no
|
|
1628
|
-
*
|
|
1648
|
+
* `subject_for(p_user uuid) returns jsonb`: what the hook would put in a token
|
|
1649
|
+
* for `p_user`, from the same membership, role, suspension and version reads,
|
|
1650
|
+
* plus the custom roles the user holds when `database` mode keeps them in
|
|
1651
|
+
* tables. A backend that only has PostgREST (`postgrestSources`) builds a
|
|
1652
|
+
* subject for an acting user or a job from it. Naming the user is why no client
|
|
1653
|
+
* role may execute it.
|
|
1629
1654
|
*/
|
|
1630
1655
|
function subjectForSql(parts, config) {
|
|
1631
1656
|
const schema = quoteIdent(parts.schema);
|
|
@@ -1797,9 +1822,9 @@ revoke execute on function ${fn}(text, text) from public, anon, authenticated;`;
|
|
|
1797
1822
|
}
|
|
1798
1823
|
/**
|
|
1799
1824
|
* The custom roles `p_user` holds: tenant and shared roles named on a
|
|
1800
|
-
* membership of the scope (and instance) they live at, and platform roles
|
|
1801
|
-
*
|
|
1802
|
-
*
|
|
1825
|
+
* membership of the scope (and instance) they live at, and platform roles among
|
|
1826
|
+
* the global roles, each with its grants and includes in `CustomRole` form. A
|
|
1827
|
+
* shadowed tenant role comes along; `resolveCustomRole`'s callers drop it.
|
|
1803
1828
|
*/
|
|
1804
1829
|
function customRolesOfSql(parts) {
|
|
1805
1830
|
const helpers = quoteIdent(parts.helpers.schema);
|
|
@@ -1850,9 +1875,15 @@ function customRolesOfSql(parts) {
|
|
|
1850
1875
|
}
|
|
1851
1876
|
//#endregion
|
|
1852
1877
|
//#region src/cli/rls/approvals.ts
|
|
1853
|
-
/**
|
|
1878
|
+
/**
|
|
1879
|
+
* `rls.approvals`' approver check; better-supabase's `isApprover` template
|
|
1880
|
+
* calls it.
|
|
1881
|
+
*/
|
|
1854
1882
|
const IS_APPROVER = "permdock_is_approver";
|
|
1855
|
-
/**
|
|
1883
|
+
/**
|
|
1884
|
+
* The objects `rls.approvals` adds. Names are part of the SQL contract
|
|
1885
|
+
* `supabaseApprovalStore` calls.
|
|
1886
|
+
*/
|
|
1856
1887
|
const APPROVAL_STORE = {
|
|
1857
1888
|
table: "approval_requests",
|
|
1858
1889
|
open: "permdock_approval_open",
|
|
@@ -1888,8 +1919,8 @@ function serverOnly(fn, args) {
|
|
|
1888
1919
|
const BODY_CHECK = `${APPROVAL_STORE.table}_body_schema`;
|
|
1889
1920
|
/**
|
|
1890
1921
|
* `rls.jsonSchema`: a pg_jsonschema check that `body` matches
|
|
1891
|
-
* `approval-request-v1.json`, added `not valid` and then validated. `auto`
|
|
1892
|
-
*
|
|
1922
|
+
* `approval-request-v1.json`, added `not valid` and then validated. `auto` adds
|
|
1923
|
+
* it only where the extension is available.
|
|
1893
1924
|
*/
|
|
1894
1925
|
function bodySchemaSql(table, mode, body = "body", check = BODY_CHECK) {
|
|
1895
1926
|
const statements = [
|
|
@@ -1911,11 +1942,11 @@ end
|
|
|
1911
1942
|
$permdock$;\n`;
|
|
1912
1943
|
}
|
|
1913
1944
|
/**
|
|
1914
|
-
* The approval store (`rls.approvals`): one table of `ApprovalRequest`
|
|
1915
|
-
*
|
|
1916
|
-
*
|
|
1917
|
-
*
|
|
1918
|
-
*
|
|
1945
|
+
* The approval store (`rls.approvals`): one table of `ApprovalRequest` bodies
|
|
1946
|
+
* with the columns a list filters on, and one `security definer` function per
|
|
1947
|
+
* `ApprovalStore` method, each one atomic statement. No client role may read
|
|
1948
|
+
* the table or execute the functions: approvals are opened and resolved by the
|
|
1949
|
+
* server, which grants its own role.
|
|
1919
1950
|
*/
|
|
1920
1951
|
function approvalStoreSql(ctx, jsonSchema = false) {
|
|
1921
1952
|
const table = qualified(ctx, APPROVAL_STORE.table);
|
|
@@ -2072,8 +2103,8 @@ ${serverOnly(fn(APPROVAL_STORE.cancel), "jsonb, text, text, text")}
|
|
|
2072
2103
|
/**
|
|
2073
2104
|
* `permdock_is_approver(p_approvers jsonb, p_tenant text default null)`: true
|
|
2074
2105
|
* when the signed-in user matches the serialised approvers of a request
|
|
2075
|
-
* (`approvers.by`), for policies on the app's own approval views. A list
|
|
2076
|
-
*
|
|
2106
|
+
* (`approvers.by`), for policies on the app's own approval views. A list needs
|
|
2107
|
+
* every item and `any-of` one of them; `user` compares the user id and
|
|
2077
2108
|
* `holder(permission)` reads `permitted_<root>_ids_by_permission` in
|
|
2078
2109
|
* `p_tenant`, or `permdock_has_permission` without one. Role, relation and
|
|
2079
2110
|
* other grantee approvers need facts the database does not hold for every
|
|
@@ -2170,19 +2201,22 @@ function approvalsSql(ctx, approvals, jsonSchema) {
|
|
|
2170
2201
|
}, jsonSchema);
|
|
2171
2202
|
return store + isApproverSql(ctx) + (delegations === true ? approvalDelegationsSql(ctx) : "");
|
|
2172
2203
|
}
|
|
2173
|
-
/**
|
|
2204
|
+
/**
|
|
2205
|
+
* The objects `rls.approvals.delegations` adds; `tableApprovalDelegationSource`
|
|
2206
|
+
* reads the table.
|
|
2207
|
+
*/
|
|
2174
2208
|
const DELEGATIONS = {
|
|
2175
2209
|
table: "approval_delegations",
|
|
2176
2210
|
covers: "permdock_cover_approves"
|
|
2177
2211
|
};
|
|
2178
2212
|
/**
|
|
2179
|
-
* `rls.approvals.delegations`: one table of out-of-office covers that a
|
|
2180
|
-
*
|
|
2181
|
-
*
|
|
2182
|
-
*
|
|
2183
|
-
* delegator
|
|
2184
|
-
*
|
|
2185
|
-
*
|
|
2213
|
+
* `rls.approvals.delegations`: one table of out-of-office covers that a user
|
|
2214
|
+
* writes for themselves, and a four-argument `permdock_is_approver` that also
|
|
2215
|
+
* answers for a delegate inside an active cover. One hop: a cover is checked
|
|
2216
|
+
* against the delegator's own approver rights, never the delegator's covers. A
|
|
2217
|
+
* delegator who is the requester never counts. A `holder()` approver through a
|
|
2218
|
+
* cover needs `rls.mode: "database"`, where the `_for` helpers exist; in `jwt`
|
|
2219
|
+
* mode only `user()` approvers pass.
|
|
2186
2220
|
*/
|
|
2187
2221
|
function approvalDelegationsSql(ctx) {
|
|
2188
2222
|
const table = qualified(ctx, DELEGATIONS.table);
|
|
@@ -2336,7 +2370,10 @@ revoke execute on function ${fn}(jsonb, text, text, text) from public, anon;
|
|
|
2336
2370
|
grant execute on function ${fn}(jsonb, text, text, text) to authenticated;
|
|
2337
2371
|
`;
|
|
2338
2372
|
}
|
|
2339
|
-
/**
|
|
2373
|
+
/**
|
|
2374
|
+
* The request fields an adopted table may mirror into its own columns, as SQL
|
|
2375
|
+
* over a body.
|
|
2376
|
+
*/
|
|
2340
2377
|
const MIRRORS = {
|
|
2341
2378
|
status: (body) => `${body} ->> 'status'`,
|
|
2342
2379
|
permission: (body) => `${body} ->> 'permission'`,
|
|
@@ -2360,7 +2397,10 @@ function mirrorsOf(adopt) {
|
|
|
2360
2397
|
}
|
|
2361
2398
|
return out;
|
|
2362
2399
|
}
|
|
2363
|
-
/**
|
|
2400
|
+
/**
|
|
2401
|
+
* One row of `table` from `values` (column, SQL), each converted to the
|
|
2402
|
+
* column's own type.
|
|
2403
|
+
*/
|
|
2364
2404
|
function populate(table, values) {
|
|
2365
2405
|
return `pg_catalog.jsonb_populate_record(null::${table}, pg_catalog.jsonb_build_object(${values.map(([column, sql]) => `${quoteLiteral(column)}, ${sql}`).join(", ")}))`;
|
|
2366
2406
|
}
|
|
@@ -2368,7 +2408,10 @@ function populate(table, values) {
|
|
|
2368
2408
|
function mirrorRow(table, mirror, body) {
|
|
2369
2409
|
return populate(table, mirror.map(([column, field]) => [column, MIRRORS[field](body)]));
|
|
2370
2410
|
}
|
|
2371
|
-
/**
|
|
2411
|
+
/**
|
|
2412
|
+
* `, (<mirrored columns>) = (select …)` for an update that writes `body`; empty
|
|
2413
|
+
* without mirrors.
|
|
2414
|
+
*/
|
|
2372
2415
|
function mirrorSet(table, mirror, body) {
|
|
2373
2416
|
if (mirror.length === 0) return "";
|
|
2374
2417
|
const columns = mirror.map(([column]) => quoteIdent(column));
|
|
@@ -2376,12 +2419,12 @@ function mirrorSet(table, mirror, body) {
|
|
|
2376
2419
|
return `,\n ${columns.length === 1 ? columns[0] ?? "" : `(${columns.join(", ")})`} = (select ${picked} from ${mirrorRow(table, mirror, body)} r)`;
|
|
2377
2420
|
}
|
|
2378
2421
|
/**
|
|
2379
|
-
* The approval store over a table the app already has (`rls.approvals:
|
|
2380
|
-
*
|
|
2381
|
-
*
|
|
2382
|
-
*
|
|
2383
|
-
*
|
|
2384
|
-
*
|
|
2422
|
+
* The approval store over a table the app already has (`rls.approvals: { table,
|
|
2423
|
+
* token?, body?, mirror? }`): the same `permdock_approval_*` functions, reading
|
|
2424
|
+
* every field from the request body in `body`, keyed by the text column
|
|
2425
|
+
* `token`, and copying the fields `mirror` names into the app's own columns,
|
|
2426
|
+
* converted to their types, on every write. The table's grants and policies
|
|
2427
|
+
* stay the app's.
|
|
2385
2428
|
*/
|
|
2386
2429
|
function adoptedApprovalStoreSql(ctx, adopt, jsonSchema = false) {
|
|
2387
2430
|
const table = quoteQualified(adopt.table);
|
|
@@ -2565,92 +2608,6 @@ ${serverOnly(fn(APPROVAL_STORE.cancel), "jsonb, text, text, text")}
|
|
|
2565
2608
|
`;
|
|
2566
2609
|
}
|
|
2567
2610
|
//#endregion
|
|
2568
|
-
//#region src/cli/rls/permission-holders.ts
|
|
2569
|
-
/** `permitted_<scope>_users(p_permission, p_id)`. Names are part of the SQL contract. */
|
|
2570
|
-
function permittedUsersHelper(scope) {
|
|
2571
|
-
return checkName(`permitted_${scope}_users`);
|
|
2572
|
-
}
|
|
2573
|
-
/** The users with a membership row on the instance `p_id`, or `undefined` when the scope's memberships are not all in tables. */
|
|
2574
|
-
function candidatesSql(ctx, scope, user) {
|
|
2575
|
-
const mapped = scopeTable(ctx, scope);
|
|
2576
|
-
if (mapped !== void 0) return {
|
|
2577
|
-
sql: ` select m.${quoteIdent(mapped.table.user)}::${user}
|
|
2578
|
-
from ${quoteQualified(mapped.table.table)} m
|
|
2579
|
-
where m.${quoteIdent(mapped.column)} = p_id`,
|
|
2580
|
-
keys: []
|
|
2581
|
-
};
|
|
2582
|
-
const sources = holderSources(ctx, scope);
|
|
2583
|
-
if (sources === void 0 || sources === "not-tables") return;
|
|
2584
|
-
return {
|
|
2585
|
-
sql: sources.map((source, index) => ` select h.user_id::${user}
|
|
2586
|
-
from (
|
|
2587
|
-
${source.holders.rows(scope, { id: `v_key_${String(index)}` }).replaceAll(/^/gmu, " ")}
|
|
2588
|
-
) h`).join("\n union\n"),
|
|
2589
|
-
keys: sources.map((source, index) => `v_key_${String(index)} ${source.holders.idType}`)
|
|
2590
|
-
};
|
|
2591
|
-
}
|
|
2592
|
-
/** `language sql`, or PL/pgSQL when a source's id column needs `p_id` in a `%type` variable. */
|
|
2593
|
-
function functionBody(keys, query) {
|
|
2594
|
-
if (keys.length === 0) return `language sql
|
|
2595
|
-
stable
|
|
2596
|
-
security definer
|
|
2597
|
-
set search_path = ''
|
|
2598
|
-
as $$
|
|
2599
|
-
${query}
|
|
2600
|
-
$$;`;
|
|
2601
|
-
return `language plpgsql
|
|
2602
|
-
stable
|
|
2603
|
-
security definer
|
|
2604
|
-
set search_path = ''
|
|
2605
|
-
as $$
|
|
2606
|
-
declare
|
|
2607
|
-
${keys.map((key) => ` ${key} := p_id;`).join("\n")}
|
|
2608
|
-
begin
|
|
2609
|
-
return query
|
|
2610
|
-
${query.replaceAll(/^/gmu, " ")};
|
|
2611
|
-
end
|
|
2612
|
-
$$;`;
|
|
2613
|
-
}
|
|
2614
|
-
/**
|
|
2615
|
-
* One `permitted_<scope>_users(p_permission, p_id)` per scope in `database`
|
|
2616
|
-
* mode: the users who hold a permission key on one instance, read from the
|
|
2617
|
-
* scope's membership rows and the global-roles table and kept when
|
|
2618
|
-
* `permitted_<scope>_ids_by_permission_for` lists the instance or
|
|
2619
|
-
* `permdock_has_permission_for` answers, so denies, custom roles, expiry and
|
|
2620
|
-
* suspension apply as for the user. It names other users, so no client role
|
|
2621
|
-
* may execute it, and a backend role needs its own grant.
|
|
2622
|
-
*/
|
|
2623
|
-
function permissionHoldersSql(ctx) {
|
|
2624
|
-
if (ctx.authorize !== "database") return "";
|
|
2625
|
-
const user = ctx.dialect === "supabase" ? "uuid" : "text";
|
|
2626
|
-
const global = globalRoleRows(ctx);
|
|
2627
|
-
const hasFor = qualified(ctx, PERMISSION_HELPERS.hasFor);
|
|
2628
|
-
return `${ctx.scopes.map(({ name }) => {
|
|
2629
|
-
const candidates = hasPermittedUsers(ctx, name) ? candidatesSql(ctx, name, user) : void 0;
|
|
2630
|
-
if (candidates === void 0) return `-- ${name}: no memberships table or table source, so permitted_${name}_users is not written`;
|
|
2631
|
-
const fn = qualified(ctx, permittedUsersHelper(name));
|
|
2632
|
-
const ids = qualified(ctx, checkName(`${permittedByPermissionHelper(name)}_for`));
|
|
2633
|
-
const type = scopeTypeOf(ctx, name);
|
|
2634
|
-
return `-- the users who hold a permission on one ${name}: its members and the global-role holders for whom the _for helpers answer; no client role may execute it
|
|
2635
|
-
create or replace function ${fn}(p_permission text, p_id ${type})
|
|
2636
|
-
returns setof ${user}
|
|
2637
|
-
${functionBody(candidates.keys, ` select c.user_id
|
|
2638
|
-
from (
|
|
2639
|
-
${candidates.sql}
|
|
2640
|
-
union
|
|
2641
|
-
select ${global.userSql}::${user}
|
|
2642
|
-
from ${global.from}
|
|
2643
|
-
) c(user_id)
|
|
2644
|
-
where c.user_id is not null
|
|
2645
|
-
and (
|
|
2646
|
-
p_id in (select ${ids}(c.user_id, p_permission))
|
|
2647
|
-
or ${hasFor}(c.user_id, p_permission)
|
|
2648
|
-
)
|
|
2649
|
-
order by 1`)}
|
|
2650
|
-
revoke execute on function ${fn}(text, ${type}) from public, anon, authenticated;`;
|
|
2651
|
-
}).join("\n\n")}\n`;
|
|
2652
|
-
}
|
|
2653
|
-
//#endregion
|
|
2654
2611
|
//#region src/cli/supabase-hook/sql.ts
|
|
2655
2612
|
const MANAGED_TRIGGER = "permdock_protect_managed";
|
|
2656
2613
|
function hookSql(parts) {
|
|
@@ -2959,10 +2916,10 @@ function signedUp(user) {
|
|
|
2959
2916
|
return `exists (select 1 from auth.users a where a.id = ${user})`;
|
|
2960
2917
|
}
|
|
2961
2918
|
/**
|
|
2962
|
-
* Every membership source whose user id lives in another table: a row of
|
|
2963
|
-
*
|
|
2964
|
-
*
|
|
2965
|
-
*
|
|
2919
|
+
* Every membership source whose user id lives in another table: a row of the
|
|
2920
|
+
* source bumps the users its old and new references hold, and a change of that
|
|
2921
|
+
* table's user id (a contact re-linked to another login) bumps the old and the
|
|
2922
|
+
* new user.
|
|
2966
2923
|
*/
|
|
2967
2924
|
function memberUsersVersionSql(parts, bumpFor) {
|
|
2968
2925
|
const holders = /* @__PURE__ */ new Map();
|
|
@@ -3074,7 +3031,10 @@ $$;
|
|
|
3074
3031
|
revoke execute on function ${linkedBump}() from public, anon, authenticated;
|
|
3075
3032
|
${userTriggers}`;
|
|
3076
3033
|
}
|
|
3077
|
-
/**
|
|
3034
|
+
/**
|
|
3035
|
+
* Every table whose role column references a roles table: the global roles and
|
|
3036
|
+
* the membership sources.
|
|
3037
|
+
*/
|
|
3078
3038
|
function roleKeyHolders(parts) {
|
|
3079
3039
|
const holders = [];
|
|
3080
3040
|
if (parts.roles?.through !== void 0) holders.push({
|
|
@@ -3108,7 +3068,10 @@ function roleKeyHolders(parts) {
|
|
|
3108
3068
|
return true;
|
|
3109
3069
|
});
|
|
3110
3070
|
}
|
|
3111
|
-
/**
|
|
3071
|
+
/**
|
|
3072
|
+
* The bump for one roles table: unchanged keys and ids return early, else every
|
|
3073
|
+
* holder of `old` is bumped.
|
|
3074
|
+
*/
|
|
3112
3075
|
function roleKeysBumpSql(holders, versionTable, indent) {
|
|
3113
3076
|
return `${indent}if tg_op = 'UPDATE'
|
|
3114
3077
|
${indent} and ${[...new Set(holders.flatMap((holder) => [holder.through.key, holder.through.id]))].map((column) => `new.${quoteIdent(column)} is not distinct from old.${quoteIdent(column)}`).join(`\n${indent} and `)} then
|
|
@@ -3124,9 +3087,9 @@ ${indent} and exists (select 1 from auth.users au where au.id = h.user_id)
|
|
|
3124
3087
|
${indent}on conflict (user_id) do update set version = v.version + 1;`;
|
|
3125
3088
|
}
|
|
3126
3089
|
/**
|
|
3127
|
-
* A renamed role key changes the `roles` claim of everyone who holds it and
|
|
3128
|
-
*
|
|
3129
|
-
*
|
|
3090
|
+
* A renamed role key changes the `roles` claim of everyone who holds it and the
|
|
3091
|
+
* `roles` of every membership that references it, so updates to a roles table
|
|
3092
|
+
* bump each holder.
|
|
3130
3093
|
*/
|
|
3131
3094
|
function roleKeysVersionSql(parts, versionTable) {
|
|
3132
3095
|
const holders = roleKeyHolders(parts);
|
|
@@ -3181,7 +3144,8 @@ function helperList(parts, types) {
|
|
|
3181
3144
|
return [
|
|
3182
3145
|
helperEntry(permittedIdsHelper(scope.name), "p_grant text", returns, client),
|
|
3183
3146
|
helperEntry(memberIdsHelper(scope.name), "", returns, client),
|
|
3184
|
-
...parts.helpers.memberFor.includes(scope.name) ? [helperEntry(memberForHelper(scope.name), "p_user uuid", returns, parts.extra.length === 0 ? [] : ["supabase_auth_admin"])] : []
|
|
3147
|
+
...parts.helpers.memberFor.includes(scope.name) ? [helperEntry(memberForHelper(scope.name), "p_user uuid", returns, parts.extra.length === 0 ? [] : ["supabase_auth_admin"])] : [],
|
|
3148
|
+
...parts.helpers.memberFor.includes(scope.name) && isTeamScope(scope.name) ? [helperEntry(memberOfHelper(scope.name), "p_user uuid", returns, client)] : []
|
|
3185
3149
|
];
|
|
3186
3150
|
})];
|
|
3187
3151
|
}
|
|
@@ -3194,8 +3158,8 @@ function helperEntry(name, args, returns, execute) {
|
|
|
3194
3158
|
};
|
|
3195
3159
|
}
|
|
3196
3160
|
/**
|
|
3197
|
-
* The helpers `rls generate` writes beyond the ones the hook's claims feed:
|
|
3198
|
-
*
|
|
3161
|
+
* The helpers `rls generate` writes beyond the ones the hook's claims feed: the
|
|
3162
|
+
* `_for` forms in `database` mode, and the assignment checks when a role
|
|
3199
3163
|
* declares `assigns` (known only with the policy).
|
|
3200
3164
|
*/
|
|
3201
3165
|
function trustedHelpers(parts, config, types, tenantType, policy) {
|
|
@@ -3215,7 +3179,7 @@ function trustedHelpers(parts, config, types, tenantType, policy) {
|
|
|
3215
3179
|
...config.rls?.apiKeys === void 0 ? [] : [helperEntry(API_KEY_ALLOWS, "p_grant text", "boolean", client)],
|
|
3216
3180
|
...config.rls?.tokenScopes === true ? [helperEntry(TOKEN_SCOPE_ALLOWS, "p_grant text", "boolean", client)] : [],
|
|
3217
3181
|
...readOnlyActorKinds(config.rls?.readOnlyActors) === void 0 ? [] : [helperEntry(ACTOR_MAY_WRITE, "", "boolean", client)],
|
|
3218
|
-
|
|
3182
|
+
...config.rls?.approvals === true || typeof config.rls?.approvals === "object" ? [helperEntry(IS_APPROVER, typeof config.rls.approvals === "object" && config.rls.approvals.delegations === true ? "p_approvers jsonb, p_tenant text, p_requester text, p_resource text" : "p_approvers jsonb, p_tenant text", "boolean", client)] : [],
|
|
3219
3183
|
...forUser
|
|
3220
3184
|
];
|
|
3221
3185
|
if (!(policy !== void 0 && (ownershipRules(policy, parts.scopes)?.assigns.length ?? 0) > 0)) return keyed;
|
|
@@ -3242,7 +3206,10 @@ function activeRowManifest(row) {
|
|
|
3242
3206
|
...keep.length === 0 ? {} : { keep }
|
|
3243
3207
|
};
|
|
3244
3208
|
}
|
|
3245
|
-
/**
|
|
3209
|
+
/**
|
|
3210
|
+
* The `rls` settings a package writing SQL next to the helpers reads: custom
|
|
3211
|
+
* roles, global roles, suspension and assignment triggers.
|
|
3212
|
+
*/
|
|
3246
3213
|
function rlsSettings(parts, config) {
|
|
3247
3214
|
const rls = config.rls;
|
|
3248
3215
|
const suspension = checkSuspension(rls?.suspension, parts.scopes);
|
|
@@ -3298,8 +3265,7 @@ function manifestOf(parts, out, config, policy) {
|
|
|
3298
3265
|
scopes: parts.scopes,
|
|
3299
3266
|
tenantClaim: parts.tenantClaim,
|
|
3300
3267
|
gucPrefix: rls?.gucPrefix ?? "app",
|
|
3301
|
-
tenantType: rls?.
|
|
3302
|
-
...rls?.teamType === void 0 ? {} : { teamType: rls.teamType },
|
|
3268
|
+
tenantType: firstScopeType(rls?.scopeTypes, parts.scopes),
|
|
3303
3269
|
...rls?.scopeTypes === void 0 ? {} : { scopeTypes: rls.scopeTypes }
|
|
3304
3270
|
};
|
|
3305
3271
|
const types = new Map(parts.scopes.map((scope) => [scope.name, scopeTypeOf(ctx, scope.name)]));
|
|
@@ -3351,15 +3317,25 @@ function manifestOf(parts, out, config, policy) {
|
|
|
3351
3317
|
hook: "v1",
|
|
3352
3318
|
grants: "v1"
|
|
3353
3319
|
},
|
|
3354
|
-
requires: requiredCapabilities(config, policy)
|
|
3320
|
+
requires: requiredCapabilities(config, policy),
|
|
3321
|
+
...policy === void 0 ? {} : { names: resolveNames(policy, config, {
|
|
3322
|
+
schema: parts.helpers.schema,
|
|
3323
|
+
tenantClaim: parts.tenantClaim
|
|
3324
|
+
}) }
|
|
3355
3325
|
};
|
|
3356
3326
|
}
|
|
3357
|
-
/**
|
|
3327
|
+
/**
|
|
3328
|
+
* The manifest without the token hook: what a project with no `supabase.hook`
|
|
3329
|
+
* records.
|
|
3330
|
+
*/
|
|
3358
3331
|
function databaseManifestOf(parts, out, config, policy) {
|
|
3359
3332
|
const { hook: _hook, budget: _budget, claims: _claims, authzVersion: _authzVersion, authzVersionBump: _authzVersionBump, memberships: _memberships, ...rest } = manifestOf(parts, out, config, policy);
|
|
3360
3333
|
return rest;
|
|
3361
3334
|
}
|
|
3362
|
-
/**
|
|
3335
|
+
/**
|
|
3336
|
+
* The first line of the generated hook: fields `--check` compares before the
|
|
3337
|
+
* full text.
|
|
3338
|
+
*/
|
|
3363
3339
|
function hookMarker(manifest) {
|
|
3364
3340
|
return `${HOOK_MARKER} schema=${manifest.hook.schema} tenant=${manifest.tenantClaim} budget=${String(manifest.budget.bytes)} claims=${manifest.claims.map((claim) => claim.name).join(",")}`;
|
|
3365
3341
|
}
|
|
@@ -3385,7 +3361,10 @@ budget, the claims the hook writes, the membership sources and the columns that
|
|
|
3385
3361
|
--out writes it as JSON, to permdock.manifest.json without a path; --check exits 1 when that
|
|
3386
3362
|
file differs.
|
|
3387
3363
|
`;
|
|
3388
|
-
/**
|
|
3364
|
+
/**
|
|
3365
|
+
* `supabase.hook.out`, else pg-delta's per-schema path under pg-delta, else
|
|
3366
|
+
* `supabase/permdock-hook.sql`.
|
|
3367
|
+
*/
|
|
3389
3368
|
function hookOut(cwd, config, schema, flag) {
|
|
3390
3369
|
const schemas = resolveSchemas(cwd, config, flag);
|
|
3391
3370
|
return config.supabase?.hook?.out !== void 0 || schemas.mode !== "pg-delta" ? defaultOut(config) : pgDeltaPath(schemas.schemaDir, "hook", schema ?? config.supabase?.hook?.schema ?? config.rls?.schema ?? "permdock");
|
|
@@ -3424,8 +3403,8 @@ function hooklessDatabase(config) {
|
|
|
3424
3403
|
return config.supabase?.hook === void 0 && resolveAuthorize(config) === "database";
|
|
3425
3404
|
}
|
|
3426
3405
|
/**
|
|
3427
|
-
* The hook migration. With `grantsOut`, the statements `supabase db diff`
|
|
3428
|
-
*
|
|
3406
|
+
* The hook migration. With `grantsOut`, the statements `supabase db diff` drops
|
|
3407
|
+
* are left out of `sql` and returned in `grants` for that file.
|
|
3429
3408
|
*/
|
|
3430
3409
|
function supabaseHookSql(scopes, config, overrides = {}, grantsOut) {
|
|
3431
3410
|
const parts = hookParts(scopes, config, overrides);
|
|
@@ -3643,4 +3622,4 @@ async function runSupabase(input) {
|
|
|
3643
3622
|
};
|
|
3644
3623
|
}
|
|
3645
3624
|
//#endregion
|
|
3646
|
-
export {
|
|
3625
|
+
export { supabaseConfig as _, supabaseHookManifest as a, resolveAuthorize as b, pd039 as c, schemasRefusal as d, declarativeSql as f, readSupabaseConfig as g, pd074 as h, runSupabase as i, isSupabaseSchemas as l, pd045 as m, hookOut as n, supabaseHookSql as o, attrsPlan as p, loadScopes as r, approvalsSql as s, grantsLabel as t, resolveSchemas as u, parseRbacAuthorize as v, rbacScaffold as y };
|