permdock 0.7.0 → 0.9.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-BcudBQOF.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-Ch07MdxN.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-K0faOLFp.d.ts → approval-prompt-3BqWczTt.d.ts} +13 -11
- package/dist/{approval-prompt-Dg5LeAcT.js → approval-prompt-B8hQY69x.js} +5 -6
- 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-BpS7LnV0.js} +2 -2
- package/dist/{arazzo-rdeJ8n1J.js → arazzo-CmQaGPkM.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-DTjR8xet.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-C6Jg75xq.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-D1nO6fiC.js → bind-BNQA9JK9.js} +26 -10
- package/dist/{bind-JDuvxjuW.d.ts → bind-YYjvfpB9.d.ts} +32 -12
- 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-BWXqwQYU.js} +3 -3
- package/dist/{capability-L7NnfhiE.js → capability-BqX94r07.js} +31 -25
- package/dist/{capability-D4UC9TTW.d.ts → capability-Di9tiUvi.d.ts} +41 -29
- package/dist/{casbin-BHijLuHY.js → casbin-B7_yS-oo.js} +2 -2
- package/dist/{casbin-BW9pS47J.js → casbin-bHyIxTNQ.js} +16 -8
- 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-CGlSwU6j.js} +20 -19
- package/dist/catalog-D3oS2GH3.js +1 -0
- package/dist/{catalog-BaMQfQ6Y.js → catalog-amPDr0JQ.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-operations-DeHTrJSV.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-3kWfjnYy.js} +4 -5
- package/dist/{codemod-BP6n8N9L.js → codemod-Bv5i-Mzo.js} +523 -201
- package/dist/{codemod-i4N2BhDc.js → codemod-D9Aiii1r.js} +3 -4
- package/dist/{collect-DNm3oKOk.js → collect-B80GYEot.js} +4 -5
- package/dist/collect-D-eroIfV.js +1 -0
- package/dist/{collect-BaWeMjwV.js → collect-WCl8cJQV.js} +26 -63
- 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-BEklRUYo.d.ts} +36 -12
- package/dist/{compile-BAEO5bOk.js → compile-EzEMB-7v.js} +77 -33
- package/dist/{completion-BNdVf7X2.js → completion-_bc0OUQ-.js} +17 -8
- package/dist/config-BwPBfN0t.js +108 -0
- package/dist/{config-DGZzMV1B.js → config-D5XrLWpk.js} +2 -2
- package/dist/{config-report-Cm7UITNA.js → config-report-BmWIskD7.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-CQkE8Esr.d.ts → core-CFepFiDP.d.ts} +49 -22
- package/dist/{core-B5-w6Kw9.js → core-DzVINFbU.js} +26 -20
- package/dist/{create-Cb86Z8Im.js → create-6EwRQlig.js} +10 -7
- package/dist/{create-DJrlhEp9.js → create-BLPKnJKa.js} +35 -25
- package/dist/{create-UTnUVETj.d.ts → create-BPUopdfL.d.ts} +70 -37
- package/dist/{create-QHuuPw3q.d.ts → create-BamXmeob.d.ts} +37 -29
- package/dist/{create-B2-CQqCI.d.ts → create-DBvUsgzK.d.ts} +49 -28
- 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-DHldhVUv.d.ts +22 -0
- package/dist/{describe-DZlnEtLy.js → describe-Bb4hGK5d.js} +5 -5
- package/dist/{describe-O0SwYIK8.d.ts → describe-BbFPBSms.d.ts} +5 -5
- package/dist/{device-BARQ8eYG.js → device-BwbJNmb2.js} +11 -8
- package/dist/{diff-Btr1c1Ow.js → diff-BwR1JdP2.js} +2 -2
- package/dist/{diff-DzT-xD13.js → diff-CQegtBAo.js} +22 -13
- package/dist/{digest-B3kc_PgQ.d.ts → digest-8Yx2CchM.d.ts} +3 -3
- package/dist/{doctor-BU1szn63.js → doctor-ClRVAtXQ.js} +287 -135
- package/dist/{doctor-BoK_y0KO.js → doctor-LPMYjSqO.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-B_Qg9D3e.d.ts → errors-BIM4MFsJ.d.ts} +22 -6
- 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/{evaluate-B_oqFbWC.js → evaluate-BAmf_AQd.js} +153 -82
- package/dist/{evaluations-BCddEOfO.d.ts → evaluations-DOWuBpWv.d.ts} +11 -5
- package/dist/{evaluations-DReoiVBw.js → evaluations-IBceAeKT.js} +40 -19
- 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-BIbBAtPZ.d.ts} +9 -6
- package/dist/{fetch-adapter-De-u6vhJ.js → fetch-adapter-dPTgJVHd.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-BFfzZSLH.js +58 -0
- package/dist/gen-BtfFWGbz.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-XBgU6RGT.js → hosted-D0IzESu_.js} +42 -21
- package/dist/{hosted-BmjzxQhp.d.ts → hosted-DVxlLZMe.d.ts} +33 -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-DB2EG_iy.js → import-ACkOrv6g.js} +6 -6
- package/dist/{import-Bz0GefWg.js → import-CST57XLp.js} +64 -51
- package/dist/{index-CMiPH2Tv.d.ts → index-BinlXeU-.d.ts} +64 -37
- package/dist/{index-BSfRl0hZ.d.ts → index-CV-7DWeD.d.ts} +64 -52
- package/dist/{index-BE8y3moU.d.ts → index-DJwEgYzA.d.ts} +127 -82
- package/dist/{index-DH9DUDEM.d.ts → index-Dj2qF9VC.d.ts} +54 -30
- package/dist/{index-BTkwrK7v.d.ts → index-vYjMrXyK.d.ts} +336 -173
- package/dist/{index-DLwcuCN_.d.ts → index-ymept53A.d.ts} +51 -30
- package/dist/index.d.ts +22 -22
- package/dist/index.js +34 -34
- package/dist/{init-B-4t1NzC.js → init-BjuFDYT1.js} +10 -10
- package/dist/{init-5TXNji88.js → init-txYTuW9u.js} +5 -5
- package/dist/{instance-options-CU0YQCLH.d.ts → instance-options-CoHn-0e8.d.ts} +4 -4
- package/dist/{instance-snapshot-CjcwnEiV.js → instance-snapshot-DuWf1cT3.js} +86 -61
- 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-qv4cr9w8.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-CfImTJGb.js} +4 -4
- package/dist/{login-WC9HPJpU.js → login-CgfCTO3F.js} +16 -9
- package/dist/{manifest-Dv6q4i5s.js → manifest-B2QPh19C.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-C-nv08_n.js} +16 -9
- 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 +79 -26
- package/dist/next/index.js +121 -10
- 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-ztVaux6j.js → openapi-BGeuunWC.js} +23 -14
- package/dist/{openapi-DMocl1bh.js → openapi-BIpw3Mb7.js} +4 -5
- package/dist/{openapi-Ddb4628T.js → openapi-BOsx0xn9.js} +33 -18
- 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-DgSDLrta.js → output-DV5dwOTs.js} +9 -5
- package/dist/output-files-BHOIlrfD.js +1 -0
- package/dist/{output-files-CCMdcFWb.js → output-files-BIQ_9pIs.js} +29 -17
- package/dist/ownership-DA5YdYTm.js +1059 -0
- package/dist/{parse-Ddhz2xf4.js → parse-1_ZheTW5.js} +16 -13
- package/dist/parse-local-manifest-CCmbhnxP.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-BfWEeMqk.js → permdock-BvjivVb9.js} +200 -140
- package/dist/{permdock-Dco6dyCK.d.ts → permdock-CprAPN3w.d.ts} +260 -129
- 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-CYcHj_w7.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-BycVKnXv.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-CU3An8uP.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-DGIO_gxq.d.ts} +782 -357
- package/dist/{postgres-store-BL9M_CA1.js → postgres-store-DcyrPS-r.js} +43 -16
- package/dist/{postgrest-r5faDIzD.js → postgrest-5Dr3W64L.js} +84 -86
- package/dist/{postgrest-CYacM_u7.d.ts → postgrest-D5nUGm-c.d.ts} +55 -35
- package/dist/powersync-B701tvhE.js +1 -0
- package/dist/{powersync-13odBwiM.js → powersync-Bg8u-JcR.js} +3 -3
- package/dist/{powersync-53ryOZip.js → powersync-CJrT1DSc.js} +127 -69
- 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-D8x73IGm.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-DfLeek9O.d.ts} +1 -1
- package/dist/{provider-store-IgqQipCO.js → provider-store-CaTv00tr.js} +13 -9
- package/dist/{pull-CN5OLxrF.js → pull-2nJr0qg_.js} +12 -11
- package/dist/pull-C3EEGzSw.js +1 -0
- package/dist/{push-tVdG8dUL.js → push-Bn-lMEmI.js} +19 -13
- package/dist/{pushed-policy-CmYeSQqq.js → pushed-policy-CDuOL2de.js} +10 -7
- package/dist/{pushed-policy-BbcY9r_4.d.ts → pushed-policy-CryQheKq.d.ts} +12 -6
- 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-Bs9Df2fQ.d.ts} +1 -1
- package/dist/{request-context-BykKLmyE.js → request-context-Duzdf0cd.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-ConCSj1y.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-Ck_PocSp.js → rls-Ba9wN0SP.js} +13 -6
- package/dist/{rls-CxBZb4rZ.js → rls-Cx0dtsB7.js} +310 -128
- 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-vHIwyXCp.js} +8 -5
- package/dist/run-Ck22anC2.js +1 -0
- package/dist/{run-uLD2aWuO.js → run-PbRlXTfh.js} +26 -23
- package/dist/{run-ticket-BpNi7BCi.d.ts → run-ticket-B2o2Kxz8.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-DK4V-3Is.js} +42 -29
- package/dist/{scan-DSljDE1Y.js → scan-CRTj6fke.js} +1 -1
- package/dist/{schema-B4v0Qrac.js → schema-BOJjqlWL.js} +3 -2
- package/dist/{schema-gIcCx7zM.js → schema-BTsE1WRT.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-CyRN0-Cd.d.ts} +88 -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-Cp_Eot9W.d.ts → sink-B5zoUW_O.d.ts} +44 -20
- package/dist/{sink-BEZSlMS_.js → sink-D9_vh372.js} +32 -21
- package/dist/{skills-g_3BS9NC.js → skills-C9uKfSF5.js} +3 -3
- package/dist/{skills-Dcjw9_1C.js → skills-CQQcuGBi.js} +12 -8
- package/dist/{snapshot-CbGmYiJx.js → snapshot-CXlzi69u.js} +21 -18
- package/dist/{snapshot-cache-Pahd3IYJ.d.ts → snapshot-cache-BjAWkchD.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-B-zYB4GS.js → sources-CMAM-2A3.js} +46 -27
- package/dist/{sources-DEEuGb8S.d.ts → sources-CWG32C0G.d.ts} +126 -53
- 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-C_pi2Rnh.js} +292 -101
- package/dist/ssf/index.d.ts +3 -3
- package/dist/ssf/index.js +47 -35
- package/dist/{standard-webhooks-DgFFD-Ga.js → standard-webhooks-D67a3nzk.js} +5 -5
- package/dist/{standard-webhooks-B_qRg0ws.d.ts → standard-webhooks-DOYEuOLx.d.ts} +7 -7
- 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-DZJvxFIZ.d.ts +59 -0
- package/dist/{stores-BqEuHC05.js → stores-DxZWDXCs.js} +42 -5
- package/dist/{stream-2Vwhl7Er.d.ts → stream-9y9qw51m.d.ts} +4 -3
- package/dist/{stream-CvdUS9V1.js → stream-CDvF0sJm.js} +5 -5
- 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-DnMMg5Fn.js} +79 -35
- package/dist/{supabase-Bqp7iIY2.js → supabase-SBs3MYUE.js} +3 -3
- package/dist/supabase-hook-C0FyEACZ.js +1 -0
- package/dist/{supabase-hook-Dg0SrQWR.js → supabase-hook-CrgU06WH.js} +175 -196
- package/dist/{supautils-MESd81bF.js → supautils-ByezN3b8.js} +385 -219
- 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-BqrxBCir.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 +225 -141
- package/dist/testing/index.js +352 -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-c7Xo_2Cu.d.ts +50 -0
- package/dist/{types-CfiKC5aN.d.ts → types-B2efzoSX.d.ts} +14 -11
- package/dist/{types-CIeZcG8v.d.ts → types-B6ExllNo.d.ts} +2 -2
- package/dist/{types-DBHftjgS.d.ts → types-BB-zWDcR.d.ts} +45 -33
- package/dist/{types-BfVmNJO5.d.ts → types-BMVDHvI0.d.ts} +128 -50
- package/dist/{types-DXmwu78Z.d.ts → types-CEinc15V.d.ts} +31 -14
- package/dist/{types-g7Oy6Zg4.d.ts → types-CN0LsqbK.d.ts} +47 -24
- package/dist/{types-CeIscIKp.d.ts → types-CWBsAwqn.d.ts} +23 -12
- package/dist/{types-DqzsnlSA.js → types-CcUXciSj.js} +17 -5
- package/dist/{types-BWZybqs9.d.ts → types-CzOeVvcC.d.ts} +384 -203
- package/dist/{types-DC44-hqb.d.ts → types-DLvhVm1r.d.ts} +59 -32
- package/dist/{types-D3A19w4A.d.ts → types-DlelvQk4.d.ts} +22 -13
- package/dist/{types-cTos-H7p.d.ts → types-DsHGPtkR.d.ts} +68 -32
- package/dist/{types-BXMYB7BY.d.ts → types-ZzRGoViD.d.ts} +77 -24
- package/dist/{types-CQVEQawv.d.ts → types-rCRV4Ge-.d.ts} +24 -14
- package/dist/types-tQB2CEnY.d.ts +262 -0
- package/dist/unplugin/index.d.ts +1 -1
- package/dist/unplugin/index.js +2 -2
- package/dist/usage-0hjZPIRX.js +1 -0
- package/dist/{usage-Bybmck7f.js → usage-B9EtHWLa.js} +50 -26
- package/dist/{usage-CDaLXCfL.js → usage-CBzgwfIs.js} +2 -2
- package/dist/{validation-error-ZfUHbKvf.js → validation-error-CYg2kJEw.js} +4 -1
- package/dist/{validation-error-CQpoquwj.d.ts → validation-error-uvp-kyfO.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-DlUcTDBz.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-CqUKX6CY.d.ts} +13 -10
- package/dist/{waiter-BGUtGYoU.js → waiter-aBLM63_f.js} +1 -1
- package/dist/{watch-C-4VmFlL.js → watch-BFDKqmUa.js} +8 -8
- package/dist/watch-ClLuO2TL.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-BoDJm0Nc.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-DxXB54Wu.d.ts} +8 -5
- package/package.json +8 -8
- 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 +16 -23
- 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,43 +1,45 @@
|
|
|
1
|
-
import { o as hasConditionOp } from "./refs-
|
|
2
|
-
import { c as listPermissions, h as formerKeys } from "./permission-registry-
|
|
3
|
-
import { u as isPrincipalRelation } from "./resource-relations-
|
|
1
|
+
import { o as hasConditionOp } from "./refs-C8BKxc_e.js";
|
|
2
|
+
import { c as listPermissions, h as formerKeys } from "./permission-registry-B8tYxPIt.js";
|
|
3
|
+
import { u as isPrincipalRelation } from "./resource-relations-8-pCScBO.js";
|
|
4
4
|
import { t as canonicalJson } from "./canonical-json-DwilZ1iB.js";
|
|
5
|
-
import { f as scopeList, o as normalizeMemberships, s as resolveScope } from "./scopes-
|
|
6
|
-
import { o as flattenGrantee } from "./grantee-
|
|
7
|
-
import {
|
|
8
|
-
import { T as validateCustomRole } from "./evaluate-
|
|
9
|
-
import { s as parseCredential } from "./credential-
|
|
10
|
-
import { a as describeError } from "./errors-
|
|
11
|
-
import { t as policyRowConditionKeys } from "./row-conditions-
|
|
12
|
-
import { a as rel, n as doctorSrcPath, o as sqlFiles, r as listSourceFiles } from "./files-
|
|
13
|
-
import { i as DOCTOR_REPORT_SCHEMA } from "./version-
|
|
14
|
-
import { c as jsonSchemaOf, i as catalogOAuthScopes } from "./catalog-doc-
|
|
15
|
-
import { a as loadModule, i as loadConfiguredPolicy, n as asPolicy, s as pickNamed } from "./load-
|
|
16
|
-
import { r as runCollect } from "./collect-BaWeMjwV.js";
|
|
5
|
+
import { f as scopeList, o as normalizeMemberships, s as resolveScope } from "./scopes-0Up_UA2t.js";
|
|
6
|
+
import { o as flattenGrantee } from "./grantee-Dke-9rd1.js";
|
|
7
|
+
import { u as separationConflicts } from "./policy-CLQ8__GF.js";
|
|
8
|
+
import { T as validateCustomRole } from "./evaluate-BAmf_AQd.js";
|
|
9
|
+
import { s as parseCredential } from "./credential-CyyyvCsL.js";
|
|
10
|
+
import { a as describeError } from "./errors-Vpu6rKHl.js";
|
|
11
|
+
import { t as policyRowConditionKeys } from "./row-conditions-BAGHOmVq.js";
|
|
12
|
+
import { a as rel, n as doctorSrcPath, o as sqlFiles, r as listSourceFiles } from "./files-BSjrtIHw.js";
|
|
13
|
+
import { i as DOCTOR_REPORT_SCHEMA } from "./version-DMQ0dnN5.js";
|
|
14
|
+
import { c as jsonSchemaOf, i as catalogOAuthScopes } from "./catalog-doc-DjMKzJp9.js";
|
|
15
|
+
import { a as loadModule, i as loadConfiguredPolicy, n as asPolicy, s as pickNamed } from "./load-DjSU5KXO.js";
|
|
17
16
|
import { t as catalogPath } from "./catalog-path-CnI0XTFK.js";
|
|
18
|
-
import {
|
|
19
|
-
import { i as
|
|
20
|
-
import {
|
|
21
|
-
import {
|
|
22
|
-
import {
|
|
23
|
-
import "./
|
|
24
|
-
import
|
|
25
|
-
import { t as
|
|
26
|
-
import { t as
|
|
27
|
-
import {
|
|
28
|
-
import {
|
|
17
|
+
import { r as runCollect } from "./collect-WCl8cJQV.js";
|
|
18
|
+
import { i as qualifySqlTable, s as quoteSqlLiteral } from "./sql-0WjxIp9g.js";
|
|
19
|
+
import { a as scopeMembershipTable } from "./compile-EzEMB-7v.js";
|
|
20
|
+
import { n as supabaseTenantClaim } from "./budget-BELja5A9.js";
|
|
21
|
+
import { d as keptKeys, r as PERMDOCK_SCHEMA } from "./sources-CMAM-2A3.js";
|
|
22
|
+
import { t as parseCatalog } from "./parse-1_ZheTW5.js";
|
|
23
|
+
import "./markers-BeHZ4x9Q.js";
|
|
24
|
+
import { t as didYouMean } from "./args-0FrVs5EH.js";
|
|
25
|
+
import { t as DOCS_BASE } from "./manifest-B2QPh19C.js";
|
|
26
|
+
import { t as createStyle } from "./style-Ds11Hmk4.js";
|
|
27
|
+
import { a as nonEmptyOr, r as findingOf } from "./output-DV5dwOTs.js";
|
|
28
|
+
import { i as runSkillsInstall } from "./skills-CQQcuGBi.js";
|
|
29
29
|
import { n as MIGRATION_DIRS, t as DEFAULT_SENSITIVE_ACTIONS } from "./constants-DcJABbLW.js";
|
|
30
|
-
import { l as partPath } from "./output-files-
|
|
31
|
-
import { _ as
|
|
32
|
-
import {
|
|
30
|
+
import { l as partPath } from "./output-files-BIQ_9pIs.js";
|
|
31
|
+
import { _ as supabaseConfig, a as supabaseHookManifest, c as pd039, g as readSupabaseConfig, h as pd074, m as pd045, n as hookOut, p as attrsPlan, u as resolveSchemas } from "./supabase-hook-CrgU06WH.js";
|
|
32
|
+
import { G as byKey, Q as graphSqlName, n as tableNameOf, o as graphPlan, r as tableNames } from "./tables-BqrxBCir.js";
|
|
33
|
+
import { a as guardedTables, p as contextRefs, r as unsatisfiedKinds, t as ownershipRules } from "./ownership-DA5YdYTm.js";
|
|
33
34
|
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-
|
|
35
|
-
import {
|
|
36
|
-
import {
|
|
37
|
-
import { t as
|
|
38
|
-
import {
|
|
39
|
-
import { a as
|
|
40
|
-
import { n as
|
|
35
|
+
import { i as group, n as membershipColumns, o as sqlStatements, r as tableKey } from "./deciding-columns-NB4wcyBf.js";
|
|
36
|
+
import { t as resolveNames } from "./resolve-names-ConCSj1y.js";
|
|
37
|
+
import { t as FIELD_VIEWS } from "./fields-D0vUI6dq.js";
|
|
38
|
+
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-B9EtHWLa.js";
|
|
39
|
+
import { d as rowConditionMessage, f as commandFor, m as tableFor, p as compileGrants, s as ROW_CONDITION_FIX, u as helperTablePolicies } from "./verify-DlUcTDBz.js";
|
|
40
|
+
import { a as streamOf, i as scopeSourcesOf, r as staleFiles, t as powersyncFiles } from "./powersync-CJrT1DSc.js";
|
|
41
|
+
import { a as buildContext, n as generateOptions, r as isRefusal, s as inheritTargets, t as supautilsRejections } from "./supautils-ByezN3b8.js";
|
|
42
|
+
import { n as legacyHelperNames, r as retirePlan, t as legacyHelperCalls } from "./retire-B2xffQgY.js";
|
|
41
43
|
import { existsSync, readFileSync, readdirSync, statSync } from "node:fs";
|
|
42
44
|
import { basename, dirname, join, resolve } from "node:path";
|
|
43
45
|
import { createRequire } from "node:module";
|
|
@@ -171,7 +173,10 @@ function membershipsFixture(input) {
|
|
|
171
173
|
//#endregion
|
|
172
174
|
//#region src/cli/doctor/assignments.ts
|
|
173
175
|
const TRIGGER = new RegExp(String.raw`^create\s+(?:or\s+replace\s+)?trigger\s+"?permdock_assignment"?\s[\s\S]*?\bon\s+((?:"[^"]+"|\w+)(?:\.(?:"[^"]+"|\w+))?)`, "iu");
|
|
174
|
-
/**
|
|
176
|
+
/**
|
|
177
|
+
* The tables a `permdock_assignment` trigger is created on in the migrations
|
|
178
|
+
* and the `rls generate` output.
|
|
179
|
+
*/
|
|
175
180
|
function triggeredTables(input) {
|
|
176
181
|
const out = input.config.rls?.out ?? "rls.sql";
|
|
177
182
|
const files = sqlFiles(input.cwd, [...input.config.doctor?.migrations ?? MIGRATION_DIRS, ...new Set([
|
|
@@ -187,10 +192,10 @@ function triggeredTables(input) {
|
|
|
187
192
|
return tables;
|
|
188
193
|
}
|
|
189
194
|
/**
|
|
190
|
-
* PD064: `rls.assignments` guards a table (a membership table, the
|
|
191
|
-
*
|
|
192
|
-
*
|
|
193
|
-
*
|
|
195
|
+
* PD064: `rls.assignments` guards a table (a membership table, the global-roles
|
|
196
|
+
* table or a listed table) that no `permdock_assignment` trigger is created on
|
|
197
|
+
* in the migrations or the `rls generate` output, so a client may write any
|
|
198
|
+
* role there.
|
|
194
199
|
*/
|
|
195
200
|
async function pd064(input) {
|
|
196
201
|
if (input.config.rls?.assignments === void 0) return [];
|
|
@@ -209,8 +214,8 @@ async function pd064(input) {
|
|
|
209
214
|
//#endregion
|
|
210
215
|
//#region src/cli/doctor/catalog.ts
|
|
211
216
|
/**
|
|
212
|
-
* A policy that declares `oauthScopes` against a catalog on disk without
|
|
213
|
-
*
|
|
217
|
+
* A policy that declares `oauthScopes` against a catalog on disk without them,
|
|
218
|
+
* or with another set. `authorizationProvider` builds better-supabase's
|
|
214
219
|
* `delegation.scopes` from the catalog, so its SQL checks deny a token that
|
|
215
220
|
* holds only the coarse scope.
|
|
216
221
|
*/
|
|
@@ -291,6 +296,72 @@ async function pd067(input) {
|
|
|
291
296
|
}]));
|
|
292
297
|
}
|
|
293
298
|
//#endregion
|
|
299
|
+
//#region src/cli/doctor/config-names.ts
|
|
300
|
+
const PLACEHOLDER = /\{([^{}]*)\}/gu;
|
|
301
|
+
/** The scope aliases `ScopeNames` admits next to the declared names. */
|
|
302
|
+
const ALIASES = ["tenant", "team"];
|
|
303
|
+
function keysOf(record) {
|
|
304
|
+
return record === void 0 ? [] : Object.keys(record);
|
|
305
|
+
}
|
|
306
|
+
function named(where, kind, names) {
|
|
307
|
+
return names.map((name) => ({
|
|
308
|
+
where,
|
|
309
|
+
kind,
|
|
310
|
+
name
|
|
311
|
+
}));
|
|
312
|
+
}
|
|
313
|
+
function namedIn(config) {
|
|
314
|
+
const rls = config.rls;
|
|
315
|
+
return [
|
|
316
|
+
...named("rls.tables", "resource", keysOf(rls?.tables)),
|
|
317
|
+
...named("rls.scopeTypes", "scope", keysOf(rls?.scopeTypes)),
|
|
318
|
+
...named("rls.actions", "action", keysOf(rls?.actions)),
|
|
319
|
+
...named("rls.memberships.scopes", "scope", keysOf(rls?.memberships?.scopes)),
|
|
320
|
+
...named("rls.suspension.scopes", "scope", keysOf(rls?.suspension?.scopes)),
|
|
321
|
+
...Object.keys(rls?.realtime?.topics ?? {}).flatMap((pattern) => named(`rls.realtime.topics['${pattern}']`, "scope", [...pattern.matchAll(PLACEHOLDER)].map((match) => match[1] ?? ""))),
|
|
322
|
+
...Object.entries(rls?.storage?.buckets ?? {}).flatMap(([name, bucket]) => named(`rls.storage.buckets.${name}.scope`, "scope", [bucket.scope])),
|
|
323
|
+
...named("powersync.resources", "resource", config.powersync?.resources ?? []),
|
|
324
|
+
...named("powersync.action", "action", config.powersync?.action === void 0 ? [] : [config.powersync.action])
|
|
325
|
+
];
|
|
326
|
+
}
|
|
327
|
+
/**
|
|
328
|
+
* PD077: a config key or value names a scope, resource or action the policy
|
|
329
|
+
* does not declare, such as a Realtime topic `{organisation}` placeholder for
|
|
330
|
+
* the scope `organization`. `defineConfig` with the policy value reports the
|
|
331
|
+
* same names at compile time. Also a SQL helper name `resolveNames` rejects:
|
|
332
|
+
* two sources sharing one, or one Postgres cannot hold.
|
|
333
|
+
*/
|
|
334
|
+
async function pd077(input) {
|
|
335
|
+
if (input.config.policy === void 0) return [];
|
|
336
|
+
const policy = await policyOf(input);
|
|
337
|
+
if (policy === void 0) return [];
|
|
338
|
+
const leaves = listPermissions(policy.vocabulary.permissions);
|
|
339
|
+
const declared = {
|
|
340
|
+
scope: /* @__PURE__ */ new Set([...policy.scopes.map((scope) => scope.name), ...ALIASES]),
|
|
341
|
+
resource: new Set(leaves.map((leaf) => leaf.resource)),
|
|
342
|
+
action: new Set(leaves.map((leaf) => leaf.action))
|
|
343
|
+
};
|
|
344
|
+
return [...namedIn(input.config).filter((entry) => !declared[entry.kind].has(entry.name)).map((entry) => ({
|
|
345
|
+
code: "PD077",
|
|
346
|
+
severity: "error",
|
|
347
|
+
message: `${entry.where} names the ${entry.kind} '${entry.name}', which the policy does not declare`,
|
|
348
|
+
fix: `use one of ${[...declared[entry.kind]].toSorted().join(", ")}, or pass the policy value to defineConfig to catch this at compile time`
|
|
349
|
+
})), ...helperNames(policy, input.config)];
|
|
350
|
+
}
|
|
351
|
+
function helperNames(policy, config) {
|
|
352
|
+
try {
|
|
353
|
+
resolveNames(policy, config);
|
|
354
|
+
return [];
|
|
355
|
+
} catch (cause) {
|
|
356
|
+
return [{
|
|
357
|
+
code: "PD077",
|
|
358
|
+
severity: "error",
|
|
359
|
+
message: describeError(cause).replace(/^PermDock CLI: /u, ""),
|
|
360
|
+
fix: "rename the scope or resource so each generated SQL helper has its own name of at most 63 bytes"
|
|
361
|
+
}];
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
//#endregion
|
|
294
365
|
//#region src/cli/doctor/declarative.ts
|
|
295
366
|
const SCHEMAS = "supabase/schemas";
|
|
296
367
|
const MIGRATIONS = "supabase/migrations";
|
|
@@ -302,7 +373,10 @@ const CALLS_HELPER = /\b(?:permdock_has|(?:permitted|member)_[a-z][a-z0-9_]*_ids
|
|
|
302
373
|
function uncommented(text) {
|
|
303
374
|
return text.replaceAll(/--[^\n]*/gu, "").replaceAll(/\/\*[\s\S]*?\*\//gu, "");
|
|
304
375
|
}
|
|
305
|
-
/**
|
|
376
|
+
/**
|
|
377
|
+
* Whether `text` starts with a line `rls generate` or `supabase hook generate`
|
|
378
|
+
* writes.
|
|
379
|
+
*/
|
|
306
380
|
function generatedByPermDock(text) {
|
|
307
381
|
return text.startsWith("-- permdock:") || text.startsWith("-- generated by permdock");
|
|
308
382
|
}
|
|
@@ -310,9 +384,9 @@ function generatedByPermDock(text) {
|
|
|
310
384
|
* PD042: under migra, a hook declared under `supabase/schemas` reaches the
|
|
311
385
|
* database through `supabase db diff`, which drops its `supabase_auth_admin`
|
|
312
386
|
* grants. pg-delta keeps them, so the check runs only for `migra`. A function
|
|
313
|
-
* created (or dropped and created again) without them is executable by
|
|
314
|
-
*
|
|
315
|
-
*
|
|
387
|
+
* created (or dropped and created again) without them is executable by `public`
|
|
388
|
+
* and not by the auth server, so a migration at or after the one that creates
|
|
389
|
+
* it must carry the grants.
|
|
316
390
|
*/
|
|
317
391
|
function pd042(cwd, config, files = nodeFiles) {
|
|
318
392
|
if (config.supabase?.hook === void 0 || resolveSchemas(cwd, config).mode !== "migra") return [];
|
|
@@ -340,10 +414,10 @@ function generatedSchemaFiles(cwd, schemaDir, files) {
|
|
|
340
414
|
}
|
|
341
415
|
/**
|
|
342
416
|
* PD068: PermDock generates for pg-delta (the default), but
|
|
343
|
-
* `supabase/config.toml` does not set `[experimental.pgdelta] enabled =
|
|
344
|
-
*
|
|
345
|
-
*
|
|
346
|
-
*
|
|
417
|
+
* `supabase/config.toml` does not set `[experimental.pgdelta] enabled = true`,
|
|
418
|
+
* so Supabase CLI 2.x diffs the schema files with migra. migra drops the hook's
|
|
419
|
+
* `supabase_auth_admin` grants and the helpers' privileges, and PermDock wrote
|
|
420
|
+
* no `--grants-out` file to restore them.
|
|
347
421
|
*/
|
|
348
422
|
function pd068(cwd, config, files = nodeFiles) {
|
|
349
423
|
const read = readSupabaseConfig(cwd);
|
|
@@ -362,8 +436,8 @@ function pd068(cwd, config, files = nodeFiles) {
|
|
|
362
436
|
/**
|
|
363
437
|
* PD069: leftovers of declarative schemas on migra in a pg-delta project:
|
|
364
438
|
* `[db.migrations] schema_paths`, which pg-delta's dependency order makes
|
|
365
|
-
* unnecessary, and numbered `NNN_permdock_<part>.sql` files that duplicate
|
|
366
|
-
*
|
|
439
|
+
* unnecessary, and numbered `NNN_permdock_<part>.sql` files that duplicate the
|
|
440
|
+
* per-schema layout `rls generate --split` now writes.
|
|
367
441
|
*/
|
|
368
442
|
function pd069(cwd, config, files = nodeFiles) {
|
|
369
443
|
const schemas = resolveSchemas(cwd, config);
|
|
@@ -383,20 +457,26 @@ function pd069(cwd, config, files = nodeFiles) {
|
|
|
383
457
|
});
|
|
384
458
|
return findings;
|
|
385
459
|
}
|
|
386
|
-
/**
|
|
460
|
+
/**
|
|
461
|
+
* The `[db.migrations] schema_paths` globs of `supabase/config.toml`, or
|
|
462
|
+
* Supabase's default.
|
|
463
|
+
*/
|
|
387
464
|
function schemaPaths(cwd) {
|
|
388
465
|
const paths = supabaseConfig(cwd).schemaPaths ?? [];
|
|
389
466
|
return paths.length === 0 ? ["./schemas/**/*.sql"] : paths;
|
|
390
467
|
}
|
|
391
|
-
/**
|
|
468
|
+
/**
|
|
469
|
+
* Schema files in the order `supabase db diff` applies them: each glob in turn,
|
|
470
|
+
* sorted within it.
|
|
471
|
+
*/
|
|
392
472
|
function orderedSchemaFiles(cwd) {
|
|
393
473
|
return sqlFiles(join(cwd, "supabase"), schemaPaths(cwd), { order: "entry" });
|
|
394
474
|
}
|
|
395
475
|
/**
|
|
396
|
-
* PD043: under migra, `db diff` applies schema files in `schema_paths`
|
|
397
|
-
*
|
|
398
|
-
*
|
|
399
|
-
*
|
|
476
|
+
* PD043: under migra, `db diff` applies schema files in `schema_paths` order,
|
|
477
|
+
* so a policy that calls `permdock_has` or `permitted_<scope>_ids` before the
|
|
478
|
+
* file that defines them fails to apply. pg-delta orders by dependencies
|
|
479
|
+
* instead.
|
|
400
480
|
*/
|
|
401
481
|
function pd043(cwd, config, files = nodeFiles) {
|
|
402
482
|
if (resolveSchemas(cwd, config).mode !== "migra") return [];
|
|
@@ -477,7 +557,7 @@ async function pd018(input) {
|
|
|
477
557
|
for (const conflict of separationConflicts(policy, record.memberships ?? [])) findings.push({
|
|
478
558
|
code: "PD018",
|
|
479
559
|
severity: "warning",
|
|
480
|
-
message: `membership ${conflict.principal
|
|
560
|
+
message: `membership ${nonEmptyOr(conflict.principal, "unknown")} holds exclusive roles ${conflict.roles.join(" and ")}`,
|
|
481
561
|
fix: "remove one of the exclusive roles from the membership fixture"
|
|
482
562
|
});
|
|
483
563
|
return findings;
|
|
@@ -512,9 +592,9 @@ async function pd023(input) {
|
|
|
512
592
|
return findings;
|
|
513
593
|
}
|
|
514
594
|
/**
|
|
515
|
-
* PD055: a stored custom role names a permission by a key it was renamed
|
|
516
|
-
*
|
|
517
|
-
*
|
|
595
|
+
* PD055: a stored custom role names a permission by a key it was renamed from.
|
|
596
|
+
* It still resolves; the alias can only be dropped once storage holds the
|
|
597
|
+
* current key.
|
|
518
598
|
*/
|
|
519
599
|
async function pd055(input) {
|
|
520
600
|
const files = filesOf(input);
|
|
@@ -540,7 +620,10 @@ async function pd055(input) {
|
|
|
540
620
|
});
|
|
541
621
|
return findings;
|
|
542
622
|
}
|
|
543
|
-
/**
|
|
623
|
+
/**
|
|
624
|
+
* Fixture API keys that never expire, credential policies that allow it, and
|
|
625
|
+
* records that are not v1 credentials.
|
|
626
|
+
*/
|
|
544
627
|
function pd029(input) {
|
|
545
628
|
const parsed = readFixture(input, input.config.doctor?.credentials);
|
|
546
629
|
const findings = [];
|
|
@@ -606,7 +689,10 @@ const ROUTE_GLOBS = ["**/api/permdock/route.{ts,tsx,js,jsx,mjs}"];
|
|
|
606
689
|
const ENDPOINT = /\bendpoint\s*(?::|=)\s*\{?\s*['"`]/u;
|
|
607
690
|
const NATIVE_IMPORT = /\bfrom\s*['"]permdock\/react-native['"]/u;
|
|
608
691
|
const CLIENT_READS = /* @__PURE__ */ new Set(["usePermission", "reference"]);
|
|
609
|
-
/**
|
|
692
|
+
/**
|
|
693
|
+
* A grant the snapshot marks `portable: false`, so a client check needs the
|
|
694
|
+
* endpoint.
|
|
695
|
+
*/
|
|
610
696
|
function serverOnly(policy, grant) {
|
|
611
697
|
if (!grant.portable || hasConditionOp(grant.where, "related")) return true;
|
|
612
698
|
const relations = policy.resources.get(grant.permission.resource)?.relations;
|
|
@@ -621,7 +707,10 @@ function serverOnlyKeys(policy) {
|
|
|
621
707
|
for (const grant of [...policy.grants, ...policy.roles.flatMap((binding) => binding.grants)]) if (grant.hosted === void 0 && grant.effect === "allow" && serverOnly(policy, grant)) keys.add(grant.permission.key);
|
|
622
708
|
return keys;
|
|
623
709
|
}
|
|
624
|
-
/**
|
|
710
|
+
/**
|
|
711
|
+
* An `app/**\/api/permdock/route.ts` that exports `permdockHandler`'s result,
|
|
712
|
+
* or an `endpoint` string in the source.
|
|
713
|
+
*/
|
|
625
714
|
function hasEndpoint(files, cwd, sources) {
|
|
626
715
|
if (listSourceFiles(cwd, ROUTE_GLOBS).filter((file) => /(?:^|[\\/])app[\\/]/u.test(rel(cwd, file))).some((file) => files.read(file).includes("permdockHandler"))) return true;
|
|
627
716
|
return sources.some((file) => ENDPOINT.test(files.read(file)));
|
|
@@ -753,11 +842,14 @@ async function pd019(input) {
|
|
|
753
842
|
fix: "set rls.authorize: 'database', or lower [auth] jwt_expiry in supabase/config.toml to 3600 or less"
|
|
754
843
|
}];
|
|
755
844
|
}
|
|
756
|
-
/** Fixture memberships the policy's scopes would drop: an undeclared scope, a missing parent id, mixed shapes. */
|
|
757
845
|
/**
|
|
758
|
-
*
|
|
759
|
-
*
|
|
760
|
-
|
|
846
|
+
* Fixture memberships the policy's scopes would drop: an undeclared scope, a
|
|
847
|
+
* missing parent id, mixed shapes.
|
|
848
|
+
*/
|
|
849
|
+
/**
|
|
850
|
+
* A scope whose roles can all be removed can end up with nobody able to manage
|
|
851
|
+
* it. Setting `min` on any of its roles (even `min: 0`) records the decision
|
|
852
|
+
* and silences the warning.
|
|
761
853
|
*/
|
|
762
854
|
async function pd026(input) {
|
|
763
855
|
if (input.config.policy === void 0) return [];
|
|
@@ -833,7 +925,10 @@ async function pd035(input) {
|
|
|
833
925
|
}
|
|
834
926
|
//#endregion
|
|
835
927
|
//#region src/cli/doctor/powersync.ts
|
|
836
|
-
/**
|
|
928
|
+
/**
|
|
929
|
+
* Why each membership source of a scope the streams read through sources has no
|
|
930
|
+
* stream form, once per source.
|
|
931
|
+
*/
|
|
837
932
|
function sourceGaps(policy, config) {
|
|
838
933
|
const scopes = scopeList(policy.scopes);
|
|
839
934
|
const sources = membershipSourcesOf(config);
|
|
@@ -849,10 +944,10 @@ function sourceGaps(policy, config) {
|
|
|
849
944
|
}
|
|
850
945
|
/**
|
|
851
946
|
* PD058: `sync-config.yaml` or the `powersync.manifest` file is not what the
|
|
852
|
-
* policy compiles to, so PowerSync syncs rows, or the device builds
|
|
853
|
-
*
|
|
854
|
-
*
|
|
855
|
-
*
|
|
947
|
+
* policy compiles to, so PowerSync syncs rows, or the device builds snapshots,
|
|
948
|
+
* by an older policy. A policy that does not compile is a finding too, and so
|
|
949
|
+
* is each membership source of a synced scope with no stream form: its members
|
|
950
|
+
* sync none of the rows it grants.
|
|
856
951
|
*/
|
|
857
952
|
async function pd058(input) {
|
|
858
953
|
const { cwd, config } = input;
|
|
@@ -912,7 +1007,10 @@ function isWorkspaceRoot(files, dir) {
|
|
|
912
1007
|
return false;
|
|
913
1008
|
}
|
|
914
1009
|
}
|
|
915
|
-
/**
|
|
1010
|
+
/**
|
|
1011
|
+
* Whether `dir` holds a skills lock: PermDock's own, or the `skills` CLI's
|
|
1012
|
+
* naming the `permdock` skill.
|
|
1013
|
+
*/
|
|
916
1014
|
function hasSkillsLock(files, dir) {
|
|
917
1015
|
if (files.exists(join(dir, ".permdock/skills-lock.json"))) return true;
|
|
918
1016
|
const shared = join(dir, "skills-lock.json");
|
|
@@ -1017,10 +1115,10 @@ const ALTER_VIEW = new RegExp(String.raw`\balter\s+view\s+(?:if\s+exists\s+)?${V
|
|
|
1017
1115
|
const INVOKER = /\bsecurity_invoker\s*(?:=\s*(?:true|on|'true'|'on'|1)\b|[,)]|$)/iu;
|
|
1018
1116
|
const COMPANION = new RegExp(String.raw`\bcomment\s+on\s+view\s+${VIEW_NAME}\s+is\s+'${FIELD_VIEWS.comment}\b`, "giu");
|
|
1019
1117
|
/**
|
|
1020
|
-
* Views run as their owner unless `security_invoker` is set, so they read
|
|
1021
|
-
*
|
|
1022
|
-
*
|
|
1023
|
-
*
|
|
1118
|
+
* Views run as their owner unless `security_invoker` is set, so they read past
|
|
1119
|
+
* RLS on the tables beneath them. The `<table>_visible_fields` companion `rls
|
|
1120
|
+
* generate --revoke-columns` writes reads as its owner on purpose and carries a
|
|
1121
|
+
* comment that says so.
|
|
1024
1122
|
*/
|
|
1025
1123
|
function pd022(cwd, config, files = nodeFiles) {
|
|
1026
1124
|
if (config.rls === void 0 && config.doctor?.migrations === void 0) return [];
|
|
@@ -1048,9 +1146,9 @@ function pd022(cwd, config, files = nodeFiles) {
|
|
|
1048
1146
|
}
|
|
1049
1147
|
const AUTH_ROLE = /\bauth\.role\s*\(\s*\)/giu;
|
|
1050
1148
|
/**
|
|
1051
|
-
* PD040: `auth.role()` in a migration. Supabase deprecated it; a policy
|
|
1052
|
-
*
|
|
1053
|
-
*
|
|
1149
|
+
* PD040: `auth.role()` in a migration. Supabase deprecated it; a policy names
|
|
1150
|
+
* its Postgres roles with `to authenticated` instead, and the role claim it
|
|
1151
|
+
* reads is the one PostgREST already switched to.
|
|
1054
1152
|
*/
|
|
1055
1153
|
function pd040(cwd, config, files = nodeFiles) {
|
|
1056
1154
|
const findings = [];
|
|
@@ -1087,10 +1185,10 @@ function applyPrivilege(writable, verb, part) {
|
|
|
1087
1185
|
const CREATE_TABLE$1 = /^create\s+(?:(?:global|local)\s+)?(?:(?:temp|temporary|unlogged)\s+)?table\s+(?:if\s+not\s+exists\s+)?((?:"[^"]+"|\w+)(?:\.(?:"[^"]+"|\w+))?)\s*\(/iu;
|
|
1088
1186
|
const REVOKE_DEFAULT_TABLES = /^alter\s+default\s+privileges\s+(?:for\s+(?:role|user)\s+[\w\s,"]+?\s+)?in\s+schema\s+"?public"?\s+revoke\s+[\s\S]+?\s+on\s+tables\s+from\s+[\s\S]*\b(?:anon|authenticated)\b/iu;
|
|
1089
1187
|
/**
|
|
1090
|
-
* Columns of `table` a client role may insert or update, per the migrations
|
|
1091
|
-
*
|
|
1092
|
-
*
|
|
1093
|
-
*
|
|
1188
|
+
* Columns of `table` a client role may insert or update, per the migrations in
|
|
1189
|
+
* order; `*` for every column. On Supabase a table created in `public` starts
|
|
1190
|
+
* writable: the default privileges grant `anon` and `authenticated` everything,
|
|
1191
|
+
* until a migration revokes them.
|
|
1094
1192
|
*/
|
|
1095
1193
|
function clientWritable(files, cwd, config, target) {
|
|
1096
1194
|
const writable = {
|
|
@@ -1119,7 +1217,10 @@ function clientWritable(files, cwd, config, target) {
|
|
|
1119
1217
|
}
|
|
1120
1218
|
return /* @__PURE__ */ new Set([...writable.insert, ...writable.update]);
|
|
1121
1219
|
}
|
|
1122
|
-
/**
|
|
1220
|
+
/**
|
|
1221
|
+
* Membership columns a client can write: a user who sets `user_id` or `role`
|
|
1222
|
+
* grants themselves access.
|
|
1223
|
+
*/
|
|
1123
1224
|
function membershipFindings(files, cwd, config) {
|
|
1124
1225
|
const findings = [];
|
|
1125
1226
|
for (const [table, columns] of membershipColumns(config)) {
|
|
@@ -1227,7 +1328,10 @@ async function pd020(input) {
|
|
|
1227
1328
|
fix: "remove them from hostable, or drop their tables from rls.tables and enforce them in the application"
|
|
1228
1329
|
}];
|
|
1229
1330
|
}
|
|
1230
|
-
/**
|
|
1331
|
+
/**
|
|
1332
|
+
* Columns of `resource` a field-limited read grant can hide: missing from an
|
|
1333
|
+
* allow's list, or on a deny's.
|
|
1334
|
+
*/
|
|
1231
1335
|
function limitedColumns(policy, resource, actions) {
|
|
1232
1336
|
const reads = policy.grants.filter((grant) => grant.permission.resource === resource && grant.fields !== void 0 && commandFor(grant.permission.action, actions) === "select");
|
|
1233
1337
|
const node = policy.resources.get(resource);
|
|
@@ -1239,8 +1343,8 @@ function limitedColumns(policy, resource, actions) {
|
|
|
1239
1343
|
}
|
|
1240
1344
|
/**
|
|
1241
1345
|
* `fields` redact in the application; RLS is row-level unless field views
|
|
1242
|
-
* compile, and a field view protects nothing while the base table still
|
|
1243
|
-
*
|
|
1346
|
+
* compile, and a field view protects nothing while the base table still returns
|
|
1347
|
+
* the columns to a direct read.
|
|
1244
1348
|
*/
|
|
1245
1349
|
async function pd030(input) {
|
|
1246
1350
|
const rls = input.config.rls;
|
|
@@ -1272,9 +1376,9 @@ async function pd030(input) {
|
|
|
1272
1376
|
return findings;
|
|
1273
1377
|
}
|
|
1274
1378
|
/**
|
|
1275
|
-
* A self-parented resource no `through` grant walks, or a `restricted`
|
|
1276
|
-
*
|
|
1277
|
-
*
|
|
1379
|
+
* A self-parented resource no `through` grant walks, or a `restricted` column
|
|
1380
|
+
* no graph grant reaches: the declaration has no effect on any decision, and
|
|
1381
|
+
* `rls generate` keeps no closure for it.
|
|
1278
1382
|
*/
|
|
1279
1383
|
async function pd031(input) {
|
|
1280
1384
|
if (input.config.policy === void 0) return [];
|
|
@@ -1302,8 +1406,8 @@ async function pd031(input) {
|
|
|
1302
1406
|
}
|
|
1303
1407
|
/**
|
|
1304
1408
|
* Under an `rls` config, a graph resource `rls generate` cannot name a helper
|
|
1305
|
-
* for: one that shares a scope's name (its `permitted_<name>_ids` would
|
|
1306
|
-
*
|
|
1409
|
+
* for: one that shares a scope's name (its `permitted_<name>_ids` would replace
|
|
1410
|
+
* the scope helper) or is not a lowercase SQL name.
|
|
1307
1411
|
*/
|
|
1308
1412
|
async function pd032(input) {
|
|
1309
1413
|
if (input.config.rls === void 0 || input.config.policy === void 0) return [];
|
|
@@ -1359,10 +1463,10 @@ async function pd034(input) {
|
|
|
1359
1463
|
}));
|
|
1360
1464
|
}
|
|
1361
1465
|
/**
|
|
1362
|
-
* PD076: `rls.actions` entries set to `'none'` that change nothing: a verb
|
|
1363
|
-
*
|
|
1364
|
-
*
|
|
1365
|
-
*
|
|
1466
|
+
* PD076: `rls.actions` entries set to `'none'` that change nothing: a verb that
|
|
1467
|
+
* is not one of the six default verbs and does not read as a write compiles to
|
|
1468
|
+
* no policy anyway, and a verb no permission uses compiles to nothing at all. A
|
|
1469
|
+
* write-sounding `none` stays, because it silences PD071.
|
|
1366
1470
|
*/
|
|
1367
1471
|
async function pd076(input) {
|
|
1368
1472
|
const actions = input.config.rls?.actions;
|
|
@@ -1385,8 +1489,9 @@ async function pd076(input) {
|
|
|
1385
1489
|
}]];
|
|
1386
1490
|
}
|
|
1387
1491
|
/**
|
|
1388
|
-
* Storage and Realtime policies written outside PermDock that call the SQL
|
|
1389
|
-
* carry row conditions: the helpers check
|
|
1492
|
+
* Storage and Realtime policies written outside PermDock that call the SQL
|
|
1493
|
+
* helpers for a permission whose grants carry row conditions: the helpers check
|
|
1494
|
+
* only role and scope.
|
|
1390
1495
|
*/
|
|
1391
1496
|
async function pd037(input) {
|
|
1392
1497
|
const files = filesOf(input);
|
|
@@ -1423,7 +1528,10 @@ const WRITE_VERB_PREFIXES = [
|
|
|
1423
1528
|
"confirm",
|
|
1424
1529
|
"pause"
|
|
1425
1530
|
];
|
|
1426
|
-
/**
|
|
1531
|
+
/**
|
|
1532
|
+
* `verb` starts with a write prefix that ends at a word boundary: `markPaid`,
|
|
1533
|
+
* not `market`.
|
|
1534
|
+
*/
|
|
1427
1535
|
function suggestsWrite(verb) {
|
|
1428
1536
|
return WRITE_VERB_PREFIXES.some((prefix) => {
|
|
1429
1537
|
if (!verb.startsWith(prefix)) return false;
|
|
@@ -1449,8 +1557,8 @@ async function pd071(input) {
|
|
|
1449
1557
|
}));
|
|
1450
1558
|
}
|
|
1451
1559
|
/**
|
|
1452
|
-
* PD072: a membership source reads role keys through the table of custom
|
|
1453
|
-
*
|
|
1560
|
+
* PD072: a membership source reads role keys through the table of custom roles
|
|
1561
|
+
* (`rls.customRoleWrites.roles`), which tenants write.
|
|
1454
1562
|
*/
|
|
1455
1563
|
function pd072(input) {
|
|
1456
1564
|
const roles = input.config.rls?.customRoleWrites?.roles;
|
|
@@ -1524,14 +1632,20 @@ const SEED_FUNCTION = /^create\s+(?:or\s+replace\s+)?function\s+(?:"[^"]+"|\w+)\
|
|
|
1524
1632
|
function rowKey(values) {
|
|
1525
1633
|
return values.join(" ");
|
|
1526
1634
|
}
|
|
1527
|
-
/**
|
|
1635
|
+
/**
|
|
1636
|
+
* The statements of a file, with the body of `<schema>.seed()` (`rls.seeds:
|
|
1637
|
+
* 'function'`) in place of its `create function`.
|
|
1638
|
+
*/
|
|
1528
1639
|
function seedStatements(sql) {
|
|
1529
1640
|
return sqlStatements(sql).flatMap((statement) => {
|
|
1530
1641
|
const fn = SEED_FUNCTION.exec(statement.text);
|
|
1531
1642
|
return fn === null ? [statement] : sqlStatements(group(fn, 2));
|
|
1532
1643
|
});
|
|
1533
1644
|
}
|
|
1534
|
-
/**
|
|
1645
|
+
/**
|
|
1646
|
+
* The rows of the last statement that seeds or clears `table`, in migration
|
|
1647
|
+
* order.
|
|
1648
|
+
*/
|
|
1535
1649
|
function lastSeed(files, cwd, config, table) {
|
|
1536
1650
|
let seeded;
|
|
1537
1651
|
for (const file of sqlFiles(cwd, config.doctor?.migrations ?? MIGRATION_DIRS)) for (const { text } of seedStatements(files.read(file))) {
|
|
@@ -1558,8 +1672,8 @@ function sample(rows) {
|
|
|
1558
1672
|
return rows.slice(0, 3).map((row) => `(${row})`).join(", ");
|
|
1559
1673
|
}
|
|
1560
1674
|
/**
|
|
1561
|
-
* PD054: the `role_permissions` rows the migrations seed last are not the
|
|
1562
|
-
*
|
|
1675
|
+
* PD054: the `role_permissions` rows the migrations seed last are not the rows
|
|
1676
|
+
* the policy compiles to, so the helpers answer from a stale policy.
|
|
1563
1677
|
*/
|
|
1564
1678
|
async function pd054(input) {
|
|
1565
1679
|
const { cwd, config } = input;
|
|
@@ -1649,7 +1763,10 @@ function pd046(cwd, config, files = nodeFiles) {
|
|
|
1649
1763
|
}];
|
|
1650
1764
|
}
|
|
1651
1765
|
const USER_METADATA = /\b(raw_user_meta_data|user_metadata)\b/giu;
|
|
1652
|
-
/**
|
|
1766
|
+
/**
|
|
1767
|
+
* PD047: SQL that reads `user_metadata`, which every user can edit for
|
|
1768
|
+
* themselves.
|
|
1769
|
+
*/
|
|
1653
1770
|
function pd047(cwd, config, files = nodeFiles) {
|
|
1654
1771
|
if (!isSupabase(files, cwd, config)) return [];
|
|
1655
1772
|
return migrationStatements(files, cwd, config).flatMap((statement) => [...statement.text.matchAll(USER_METADATA)].map((match) => ({
|
|
@@ -1673,7 +1790,10 @@ function createdFunctions(statements) {
|
|
|
1673
1790
|
}];
|
|
1674
1791
|
});
|
|
1675
1792
|
}
|
|
1676
|
-
/**
|
|
1793
|
+
/**
|
|
1794
|
+
* PD048: a function without `set search_path`, so a caller's objects can shadow
|
|
1795
|
+
* the ones it names.
|
|
1796
|
+
*/
|
|
1677
1797
|
function pd048(cwd, config, files = nodeFiles) {
|
|
1678
1798
|
if (!isSupabase(files, cwd, config)) return [];
|
|
1679
1799
|
const statements = migrationStatements(files, cwd, config);
|
|
@@ -1691,7 +1811,10 @@ function pd048(cwd, config, files = nodeFiles) {
|
|
|
1691
1811
|
};
|
|
1692
1812
|
});
|
|
1693
1813
|
}
|
|
1694
|
-
/**
|
|
1814
|
+
/**
|
|
1815
|
+
* Roles each `revoke` statement takes `execute` from, per function key or
|
|
1816
|
+
* `schema.*`.
|
|
1817
|
+
*/
|
|
1695
1818
|
function revokedExecute(statements) {
|
|
1696
1819
|
const revoked = /* @__PURE__ */ new Map();
|
|
1697
1820
|
const add = (key, roles) => {
|
|
@@ -1713,7 +1836,10 @@ function revokedExecute(statements) {
|
|
|
1713
1836
|
}
|
|
1714
1837
|
return revoked;
|
|
1715
1838
|
}
|
|
1716
|
-
/**
|
|
1839
|
+
/**
|
|
1840
|
+
* `supabase.hook.claims` and `hook.before` functions, by key, with the argument
|
|
1841
|
+
* type the hook calls them with.
|
|
1842
|
+
*/
|
|
1717
1843
|
function hookClaimFunctions(config) {
|
|
1718
1844
|
const hook = config.supabase?.hook;
|
|
1719
1845
|
const before = hook?.before;
|
|
@@ -1725,9 +1851,9 @@ function hookClaimFunctions(config) {
|
|
|
1725
1851
|
/**
|
|
1726
1852
|
* PD049: a `security definer` function `public` (every role) or, in Supabase's
|
|
1727
1853
|
* `public` schema, `anon` may still execute: Postgres grants `execute` to
|
|
1728
|
-
* `public` on create, and Supabase's default privileges grant it to `anon`.
|
|
1729
|
-
*
|
|
1730
|
-
*
|
|
1854
|
+
* `public` on create, and Supabase's default privileges grant it to `anon`. A
|
|
1855
|
+
* hook claim function returns any user's claims, so `authenticated` must not
|
|
1856
|
+
* execute it either, definer or not.
|
|
1731
1857
|
*/
|
|
1732
1858
|
function pd049(cwd, config, files = nodeFiles) {
|
|
1733
1859
|
if (!isSupabase(files, cwd, config)) return [];
|
|
@@ -1770,7 +1896,10 @@ function pd049(cwd, config, files = nodeFiles) {
|
|
|
1770
1896
|
const CREATE_TABLE = new RegExp(String.raw`^create\s+(?:(?:global|local)\s+)?(?:(?:temp|temporary|unlogged)\s+)?table\s+(?:if\s+not\s+exists\s+)?${NAME}\s*\(`, "iu");
|
|
1771
1897
|
const ENABLE_RLS = new RegExp(String.raw`^alter\s+table\s+(?:if\s+exists\s+)?(?:only\s+)?${NAME}[\s\S]*\benable\s+row\s+level\s+security\b`, "iu");
|
|
1772
1898
|
const DROP_TABLE = /^drop\s+table\s+(?:if\s+exists\s+)?([\s\S]+?)(?:\s+(?:cascade|restrict))?$/iu;
|
|
1773
|
-
/**
|
|
1899
|
+
/**
|
|
1900
|
+
* PD050: a `public` table without row level security, which the Data API serves
|
|
1901
|
+
* whole.
|
|
1902
|
+
*/
|
|
1774
1903
|
function pd050(cwd, config, files = nodeFiles) {
|
|
1775
1904
|
if (!isSupabase(files, cwd, config)) return [];
|
|
1776
1905
|
const created = /* @__PURE__ */ new Map();
|
|
@@ -1798,7 +1927,10 @@ function pd050(cwd, config, files = nodeFiles) {
|
|
|
1798
1927
|
}
|
|
1799
1928
|
const CREATE_POLICY = new RegExp(String.raw`^create\s+policy\s+${IDENT}\s+on\s+${NAME}([\s\S]*)$`, "iu");
|
|
1800
1929
|
const UNWRAPPED_AUTH = /(?<!\bselect\s{1,20})\bauth\.(uid|jwt)\s*\(\s*\)/giu;
|
|
1801
|
-
/**
|
|
1930
|
+
/**
|
|
1931
|
+
* PD051: a policy that calls `auth.uid()` or `auth.jwt()` bare, so Postgres
|
|
1932
|
+
* runs it once per row.
|
|
1933
|
+
*/
|
|
1802
1934
|
function pd051(cwd, config, files = nodeFiles) {
|
|
1803
1935
|
if (!isSupabase(files, cwd, config)) return [];
|
|
1804
1936
|
return migrationStatements(files, cwd, config).flatMap((statement) => {
|
|
@@ -1814,7 +1946,10 @@ function pd051(cwd, config, files = nodeFiles) {
|
|
|
1814
1946
|
}];
|
|
1815
1947
|
});
|
|
1816
1948
|
}
|
|
1817
|
-
/**
|
|
1949
|
+
/**
|
|
1950
|
+
* PD052: an update policy without `with check`, so nothing states what a row
|
|
1951
|
+
* may become.
|
|
1952
|
+
*/
|
|
1818
1953
|
function pd052(cwd, config, files = nodeFiles) {
|
|
1819
1954
|
if (!isSupabase(files, cwd, config)) return [];
|
|
1820
1955
|
return migrationStatements(files, cwd, config).flatMap((statement) => {
|
|
@@ -1847,9 +1982,9 @@ function topLevelParts(body) {
|
|
|
1847
1982
|
return parts.filter((part) => part !== "");
|
|
1848
1983
|
}
|
|
1849
1984
|
/**
|
|
1850
|
-
* One column definition or table constraint of a `create table` body: its
|
|
1851
|
-
*
|
|
1852
|
-
*
|
|
1985
|
+
* One column definition or table constraint of a `create table` body: its first
|
|
1986
|
+
* column, whether it is a foreign key, and whether a primary key or unique
|
|
1987
|
+
* constraint indexes that column.
|
|
1853
1988
|
*/
|
|
1854
1989
|
function tablePart(raw) {
|
|
1855
1990
|
const part = raw.replace(/^constraint\s+(?:"[^"]+"|\w+)\s+/iu, "");
|
|
@@ -1873,7 +2008,10 @@ function firstColumn(list) {
|
|
|
1873
2008
|
}
|
|
1874
2009
|
const ADD_CONSTRAINT = new RegExp(String.raw`^alter\s+table\s+(?:if\s+exists\s+)?(?:only\s+)?${NAME}\s+add\s+(?:constraint\s+${IDENT}\s+)?(foreign\s+key|primary\s+key|unique)\s*\(([^)]*)\)`, "iu");
|
|
1875
2010
|
const CREATE_INDEX = new RegExp(String.raw`^create\s+(?:unique\s+)?index\s+(?:concurrently\s+)?(?:if\s+not\s+exists\s+)?(?:${IDENT}\s+)?on\s+(?:only\s+)?${NAME}\s*(?:using\s+\w+\s*)?\(\s*${IDENT}`, "iu");
|
|
1876
|
-
/**
|
|
2011
|
+
/**
|
|
2012
|
+
* PD053: a foreign key no index starts with, so joins and deletes on the
|
|
2013
|
+
* referenced row scan the table.
|
|
2014
|
+
*/
|
|
1877
2015
|
function pd053(cwd, config, files = nodeFiles) {
|
|
1878
2016
|
if (!isSupabase(files, cwd, config)) return [];
|
|
1879
2017
|
const keys = [];
|
|
@@ -1922,10 +2060,10 @@ function at(statement) {
|
|
|
1922
2060
|
return `${statement.file}:${String(statement.line)}`;
|
|
1923
2061
|
}
|
|
1924
2062
|
/**
|
|
1925
|
-
* PD062: SQL that reads or sets a per-claim `request.jwt.claim.<name>`
|
|
1926
|
-
*
|
|
1927
|
-
*
|
|
1928
|
-
*
|
|
2063
|
+
* PD062: SQL that reads or sets a per-claim `request.jwt.claim.<name>` setting.
|
|
2064
|
+
* Current PostgREST, `withPostgresClient`, PermDock's `withSubject` and `rls
|
|
2065
|
+
* verify` set only `request.jwt.claims`. A function replaced by a later
|
|
2066
|
+
* migration is judged by its last definition.
|
|
1929
2067
|
*/
|
|
1930
2068
|
function pd062(cwd, config, files = nodeFiles) {
|
|
1931
2069
|
if (!isSupabase(files, cwd, config)) return [];
|
|
@@ -1944,8 +2082,8 @@ function pd062(cwd, config, files = nodeFiles) {
|
|
|
1944
2082
|
});
|
|
1945
2083
|
}
|
|
1946
2084
|
/**
|
|
1947
|
-
* PD063: a migration statement supautils rejects for `postgres`, so
|
|
1948
|
-
*
|
|
2085
|
+
* PD063: a migration statement supautils rejects for `postgres`, so `supabase
|
|
2086
|
+
* db push` fails on it.
|
|
1949
2087
|
*/
|
|
1950
2088
|
function pd063(cwd, config, files = nodeFiles) {
|
|
1951
2089
|
if (!isSupabase(files, cwd, config)) return [];
|
|
@@ -2003,9 +2141,9 @@ function pd066(cwd, config, files = nodeFiles) {
|
|
|
2003
2141
|
//#endregion
|
|
2004
2142
|
//#region src/cli/doctor/suspension.ts
|
|
2005
2143
|
/**
|
|
2006
|
-
* PD061: a suspended scope keeps permissions. Each scope's kept keys are
|
|
2007
|
-
*
|
|
2008
|
-
*
|
|
2144
|
+
* PD061: a suspended scope keeps permissions. Each scope's kept keys are listed
|
|
2145
|
+
* for review, since its members hold them while the instance is suspended, and
|
|
2146
|
+
* a key the definitions do not declare is named apart.
|
|
2009
2147
|
*/
|
|
2010
2148
|
async function pd061(input) {
|
|
2011
2149
|
const suspension = input.config.rls?.suspension;
|
|
@@ -2255,6 +2393,11 @@ const DOCTOR_CHECKS = [
|
|
|
2255
2393
|
groups: ["rls"],
|
|
2256
2394
|
run: pd076
|
|
2257
2395
|
},
|
|
2396
|
+
{
|
|
2397
|
+
code: "PD077",
|
|
2398
|
+
groups: ["rls", "scopes"],
|
|
2399
|
+
run: pd077
|
|
2400
|
+
},
|
|
2258
2401
|
{
|
|
2259
2402
|
code: "PD028",
|
|
2260
2403
|
groups: ["attrs", "supabase"],
|
|
@@ -2478,7 +2621,10 @@ async function runDoctor(input) {
|
|
|
2478
2621
|
}))
|
|
2479
2622
|
};
|
|
2480
2623
|
}
|
|
2481
|
-
/**
|
|
2624
|
+
/**
|
|
2625
|
+
* PD059: the configured policy module throws or exports no policy, so every
|
|
2626
|
+
* policy check is skipped.
|
|
2627
|
+
*/
|
|
2482
2628
|
async function pd059(project) {
|
|
2483
2629
|
const load = await project.policyLoad();
|
|
2484
2630
|
if (load.status !== "failed") return [];
|
|
@@ -2489,7 +2635,10 @@ async function pd059(project) {
|
|
|
2489
2635
|
fix: "fix the module so it exports policy from definePolicy, or point policy in permdock.config.ts at the module that does"
|
|
2490
2636
|
}];
|
|
2491
2637
|
}
|
|
2492
|
-
/**
|
|
2638
|
+
/**
|
|
2639
|
+
* PD060: a source file under srcPath has a syntax error, so collect and usage
|
|
2640
|
+
* miss what it references.
|
|
2641
|
+
*/
|
|
2493
2642
|
async function pd060(project) {
|
|
2494
2643
|
return ((await project.collected()).scan?.unparsed ?? []).map((item) => ({
|
|
2495
2644
|
code: "PD060",
|
|
@@ -2498,7 +2647,10 @@ async function pd060(project) {
|
|
|
2498
2647
|
fix: "fix the syntax error, or exclude the file from collect.srcPath"
|
|
2499
2648
|
}));
|
|
2500
2649
|
}
|
|
2501
|
-
/**
|
|
2650
|
+
/**
|
|
2651
|
+
* A usage message for the first `--only` value that names no check code or
|
|
2652
|
+
* group.
|
|
2653
|
+
*/
|
|
2502
2654
|
function unknownOnly(wanted) {
|
|
2503
2655
|
const known = /* @__PURE__ */ new Set();
|
|
2504
2656
|
for (const check of DOCTOR_CHECKS) {
|