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
package/dist/hono/index.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { t as compact } from "../compact-CAf557ZB.js";
|
|
2
|
-
import { r as PermDockRevokedError } from "../errors-
|
|
3
|
-
import { l as InvalidSignatureError, p as webBotAuthVerifier, u as discoverViaSignatureAgent } from "../evaluations-
|
|
4
|
-
import { t as problemFromError } from "../map-error-
|
|
5
|
-
import { r as bindKernel } from "../bind-
|
|
6
|
-
import { a as onRevoked, n as closeReason, r as guardIterable, t as POLICY_VIOLATION } from "../stream-
|
|
2
|
+
import { r as PermDockRevokedError } from "../errors-B6R_lg2a.js";
|
|
3
|
+
import { l as InvalidSignatureError, p as webBotAuthVerifier, u as discoverViaSignatureAgent } from "../evaluations-IBceAeKT.js";
|
|
4
|
+
import { t as problemFromError } from "../map-error-pasIGqMT.js";
|
|
5
|
+
import { r as bindKernel } from "../bind-D_sZSVA3.js";
|
|
6
|
+
import { a as onRevoked, n as closeReason, r as guardIterable, t as POLICY_VIOLATION } from "../stream-CDvF0sJm.js";
|
|
7
7
|
import { Hono } from "hono";
|
|
8
8
|
//#region src/hono/create.ts
|
|
9
9
|
function socket(connection, events) {
|
|
@@ -1,6 +1,9 @@
|
|
|
1
|
-
import { T as Policy, a as ApprovalRequirement, mr as Condition, wn as Grantee } from "./policy-types-
|
|
1
|
+
import { T as Policy, a as ApprovalRequirement, mr as Condition, wn as Grantee } from "./policy-types-CCiDRZBH.js";
|
|
2
2
|
//#region src/core/hosted.d.ts
|
|
3
|
-
/**
|
|
3
|
+
/**
|
|
4
|
+
* One grant authored in PermDock Cloud; its grantee is a declared role, plan or
|
|
5
|
+
* relation.
|
|
6
|
+
*/
|
|
4
7
|
type HostedGrant = {
|
|
5
8
|
readonly id: string;
|
|
6
9
|
readonly permission: string;
|
|
@@ -12,9 +15,9 @@ type HostedGrant = {
|
|
|
12
15
|
readonly fields?: readonly string[];
|
|
13
16
|
};
|
|
14
17
|
/**
|
|
15
|
-
* PolicyDocument v1. Signed as a `vnd.permdock.policy+jwt`, the `policy`
|
|
16
|
-
*
|
|
17
|
-
* `
|
|
18
|
+
* PolicyDocument v1. Signed as a `vnd.permdock.policy+jwt`, the `policy` claim
|
|
19
|
+
* carries every field but `id` and `issuedAt`, which are the token's `jti` and
|
|
20
|
+
* `iat` (`policyDocumentFromClaims`).
|
|
18
21
|
*/
|
|
19
22
|
type PolicyDocument = {
|
|
20
23
|
readonly v: 1;
|
|
@@ -27,17 +30,20 @@ type PolicyDocument = {
|
|
|
27
30
|
readonly grants: readonly HostedGrant[];
|
|
28
31
|
};
|
|
29
32
|
/**
|
|
30
|
-
* The channel for hosted grants. `getPermDock` reads `current()` once;
|
|
31
|
-
*
|
|
33
|
+
* The channel for hosted grants. `getPermDock` reads `current()` once; the
|
|
34
|
+
* application calls `refresh()` on its own schedule, never a check.
|
|
32
35
|
*/
|
|
33
36
|
type PolicySource = {
|
|
34
37
|
/** Names the implementation in errors and events. */
|
|
35
38
|
readonly name?: string;
|
|
36
|
-
current()
|
|
37
|
-
refresh()
|
|
39
|
+
current: () => PolicyDocument | null;
|
|
40
|
+
refresh: () => Promise<void>;
|
|
38
41
|
};
|
|
39
42
|
type HostedGrantDropReason = "not-hostable" | "unknown-permission" | "unknown-grantee" | "non-portable" | "weaker-approval" | "invalid";
|
|
40
|
-
/**
|
|
43
|
+
/**
|
|
44
|
+
* Reported through `on('error')` when a hosted grant is not merged; never
|
|
45
|
+
* thrown.
|
|
46
|
+
*/
|
|
41
47
|
type HostedGrantDropped = {
|
|
42
48
|
readonly kind: "hosted-grant-dropped";
|
|
43
49
|
readonly document: string;
|
|
@@ -47,9 +53,15 @@ type HostedGrantDropped = {
|
|
|
47
53
|
declare function memoryPolicySource(document?: PolicyDocument | null): PolicySource;
|
|
48
54
|
/** Validates the document envelope; per-grant checks happen at merge time. */
|
|
49
55
|
declare function parsePolicyDocument(json: unknown): PolicyDocument;
|
|
50
|
-
/**
|
|
56
|
+
/**
|
|
57
|
+
* The document verified `vnd.permdock.policy+jwt` claims carry: `policy`, with
|
|
58
|
+
* `jti` as `id` and `iat` as `issuedAt`. Throws like `parsePolicyDocument`.
|
|
59
|
+
*/
|
|
51
60
|
declare function policyDocumentFromClaims(claims: Readonly<Record<string, unknown>>): PolicyDocument;
|
|
52
|
-
/**
|
|
61
|
+
/**
|
|
62
|
+
* True for the portable subset only: no `opaque`, no `sqlFunction`, no unknown
|
|
63
|
+
* op.
|
|
64
|
+
*/
|
|
53
65
|
declare function isPortableCondition(value: unknown): value is Condition;
|
|
54
66
|
type HostedGrantCheck = {
|
|
55
67
|
readonly ok: true;
|
|
@@ -59,24 +71,24 @@ type HostedGrantCheck = {
|
|
|
59
71
|
};
|
|
60
72
|
/**
|
|
61
73
|
* Whether `mergeHostedGrants` would keep one candidate hosted grant, and the
|
|
62
|
-
* drop reason it would report when not. Needs no `PolicyDocument`, so a
|
|
63
|
-
*
|
|
74
|
+
* drop reason it would report when not. Needs no `PolicyDocument`, so a grant
|
|
75
|
+
* form can check a grant before it publishes one.
|
|
64
76
|
*/
|
|
65
77
|
declare function checkHostedGrant(policy: Policy, grant: unknown): HostedGrantCheck;
|
|
66
78
|
/**
|
|
67
|
-
* The code policy plus the hosted grants that pass every rule. Hosted
|
|
68
|
-
*
|
|
69
|
-
*
|
|
79
|
+
* The code policy plus the hosted grants that pass every rule. Hosted allows OR
|
|
80
|
+
* with code allows and any deny still wins, so a hosted grant can never
|
|
81
|
+
* override a code deny; one that fails a rule is dropped, not thrown.
|
|
70
82
|
*/
|
|
71
83
|
declare function mergeHostedGrants(policy: Policy, document: PolicyDocument | null): {
|
|
72
84
|
readonly policy: Policy;
|
|
73
85
|
readonly dropped: readonly HostedGrantDropped[];
|
|
74
86
|
};
|
|
75
87
|
/**
|
|
76
|
-
* Hosted grants as an instance option: `policies: hostedPolicies(source)`.
|
|
77
|
-
*
|
|
78
|
-
* `source.current()` is read once per instance; a throw keeps the code
|
|
79
|
-
*
|
|
88
|
+
* Hosted grants as an instance option: `policies: hostedPolicies(source)`. The
|
|
89
|
+
* merge code ships only with an app that imports this function.
|
|
90
|
+
* `source.current()` is read once per instance; a throw keeps the code policy
|
|
91
|
+
* and is reported as an error event.
|
|
80
92
|
*/
|
|
81
93
|
type HostedPolicies = {
|
|
82
94
|
readonly feature: "hosted-policies";
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { r as isRecord, t as compact } from "./compact-CAf557ZB.js";
|
|
2
|
-
import { n as freezeDeep } from "./freeze-
|
|
3
|
-
import { n as isForbiddenKey, s as splitPath } from "./paths-
|
|
4
|
-
import { a as deny, i as completeGrant, n as role, p as normalizeWhere, r as allow } from "./role-builder-
|
|
5
|
-
import { a as getResource, n as findPermission } from "./permission-registry-
|
|
6
|
-
import { d as isSelfParented } from "./resource-relations-
|
|
7
|
-
import { a as durationOf, l as isRfc3339, m as rfc3339 } from "./time-
|
|
8
|
-
import { r as sha256Digest } from "./sha256-
|
|
9
|
-
import { _ as listPlans, m as findRole, o as flattenGrantee } from "./grantee-
|
|
10
|
-
import {
|
|
2
|
+
import { n as freezeDeep } from "./freeze-jjan0lCv.js";
|
|
3
|
+
import { n as isForbiddenKey, s as splitPath } from "./paths-CUvURzHp.js";
|
|
4
|
+
import { a as deny, i as completeGrant, n as role, p as normalizeWhere, r as allow } from "./role-builder-BK2-T6oD.js";
|
|
5
|
+
import { a as getResource, n as findPermission } from "./permission-registry-B8tYxPIt.js";
|
|
6
|
+
import { d as isSelfParented } from "./resource-relations-8-pCScBO.js";
|
|
7
|
+
import { a as durationOf, l as isRfc3339, m as rfc3339 } from "./time-nR1JesoH.js";
|
|
8
|
+
import { r as sha256Digest } from "./sha256-C-4WXKIu.js";
|
|
9
|
+
import { _ as listPlans, m as findRole, o as flattenGrantee } from "./grantee-Dke-9rd1.js";
|
|
10
|
+
import { a as indexPolicy, n as declaredRoleNames } from "./policy-CLQ8__GF.js";
|
|
11
11
|
//#region src/core/hosted.ts
|
|
12
12
|
function memoryPolicySource(document = null) {
|
|
13
13
|
const current = document === null ? null : parsePolicyDocument(document);
|
|
@@ -37,7 +37,10 @@ function parsePolicyDocument(json) {
|
|
|
37
37
|
if (typeof copy["id"] !== "string" || typeof copy["fingerprint"] !== "string" || typeof copy["catalog"] !== "string" || !isRfc3339(copy["issuedAt"]) || !Array.isArray(copy["grants"])) throw new TypeError("PermDock: malformed policy document");
|
|
38
38
|
return freezeDeep(copy);
|
|
39
39
|
}
|
|
40
|
-
/**
|
|
40
|
+
/**
|
|
41
|
+
* The document verified `vnd.permdock.policy+jwt` claims carry: `policy`, with
|
|
42
|
+
* `jti` as `id` and `iat` as `issuedAt`. Throws like `parsePolicyDocument`.
|
|
43
|
+
*/
|
|
41
44
|
function policyDocumentFromClaims(claims) {
|
|
42
45
|
const claim = claims["policy"];
|
|
43
46
|
const jti = claims["jti"];
|
|
@@ -71,7 +74,10 @@ function portableValue(value) {
|
|
|
71
74
|
if (keys[0] === "ref") return safePath(value["ref"]);
|
|
72
75
|
return keys[0] === "date" && typeof value["date"] === "string";
|
|
73
76
|
}
|
|
74
|
-
/**
|
|
77
|
+
/**
|
|
78
|
+
* True for the portable subset only: no `opaque`, no `sqlFunction`, no unknown
|
|
79
|
+
* op.
|
|
80
|
+
*/
|
|
75
81
|
function isPortableCondition(value) {
|
|
76
82
|
if (!isRecord(value) || typeof value["op"] !== "string") return false;
|
|
77
83
|
const op = value["op"];
|
|
@@ -105,7 +111,10 @@ function approvalRank(approval) {
|
|
|
105
111
|
escalates: approval.escalation !== void 0
|
|
106
112
|
};
|
|
107
113
|
}
|
|
108
|
-
/**
|
|
114
|
+
/**
|
|
115
|
+
* A hosted approval must meet every approval a code allow requires on the
|
|
116
|
+
* permission.
|
|
117
|
+
*/
|
|
109
118
|
function approvalAtLeast(hosted, code) {
|
|
110
119
|
const mine = approvalRank(hosted);
|
|
111
120
|
for (const required of code) {
|
|
@@ -120,11 +129,17 @@ function approvalAtLeast(hosted, code) {
|
|
|
120
129
|
}
|
|
121
130
|
return true;
|
|
122
131
|
}
|
|
123
|
-
/**
|
|
132
|
+
/**
|
|
133
|
+
* A grantee kind this build does not know is never declared, so the hosted
|
|
134
|
+
* grant is dropped.
|
|
135
|
+
*/
|
|
124
136
|
function undeclaredKind(_grantee) {
|
|
125
137
|
return false;
|
|
126
138
|
}
|
|
127
|
-
/**
|
|
139
|
+
/**
|
|
140
|
+
* Whether a hosted grant may name `grantee` on a permission of
|
|
141
|
+
* `permissionResource`.
|
|
142
|
+
*/
|
|
128
143
|
function declaredGrantee(policy, grantee, permissionResource) {
|
|
129
144
|
switch (grantee.kind) {
|
|
130
145
|
case "role": return declaredRoleNames(policy).has(grantee.role);
|
|
@@ -157,7 +172,10 @@ function granteesAcceptable(policy, raw, permissionResource) {
|
|
|
157
172
|
const items = flattenGrantee(raw);
|
|
158
173
|
return items.length > 0 && items.every((item) => isRecord(item) && item.kind !== "relation" && (item.kind === "authenticated" || declaredGrantee(policy, item, permissionResource)));
|
|
159
174
|
}
|
|
160
|
-
/**
|
|
175
|
+
/**
|
|
176
|
+
* The approvals the code allows on `key` carry; a hosted allow must meet each
|
|
177
|
+
* one.
|
|
178
|
+
*/
|
|
161
179
|
function codeApprovals(policy, key) {
|
|
162
180
|
return policy.grants.filter((grant) => grant.effect === "allow" && grant.hosted === void 0 && grant.permission.key === key).map((grant) => grant.approval);
|
|
163
181
|
}
|
|
@@ -246,8 +264,8 @@ const CHECKED_DOCUMENT = Object.freeze({
|
|
|
246
264
|
});
|
|
247
265
|
/**
|
|
248
266
|
* Whether `mergeHostedGrants` would keep one candidate hosted grant, and the
|
|
249
|
-
* drop reason it would report when not. Needs no `PolicyDocument`, so a
|
|
250
|
-
*
|
|
267
|
+
* drop reason it would report when not. Needs no `PolicyDocument`, so a grant
|
|
268
|
+
* form can check a grant before it publishes one.
|
|
251
269
|
*/
|
|
252
270
|
function checkHostedGrant(policy, grant) {
|
|
253
271
|
const result = buildGrant(policy, CHECKED_DOCUMENT, grant);
|
|
@@ -256,7 +274,10 @@ function checkHostedGrant(policy, grant) {
|
|
|
256
274
|
reason: result.reason
|
|
257
275
|
};
|
|
258
276
|
}
|
|
259
|
-
/**
|
|
277
|
+
/**
|
|
278
|
+
* The grants of `document` that `policy` drops, in document order;
|
|
279
|
+
* `permdock/catalog` turns them into drift findings.
|
|
280
|
+
*/
|
|
260
281
|
function hostedGrantDrops(policy, document) {
|
|
261
282
|
return document.grants.flatMap((raw) => {
|
|
262
283
|
const result = buildGrant(policy, document, raw);
|
|
@@ -269,9 +290,9 @@ function hostedGrantDrops(policy, document) {
|
|
|
269
290
|
});
|
|
270
291
|
}
|
|
271
292
|
/**
|
|
272
|
-
* The code policy plus the hosted grants that pass every rule. Hosted
|
|
273
|
-
*
|
|
274
|
-
*
|
|
293
|
+
* The code policy plus the hosted grants that pass every rule. Hosted allows OR
|
|
294
|
+
* with code allows and any deny still wins, so a hosted grant can never
|
|
295
|
+
* override a code deny; one that fails a rule is dropped, not thrown.
|
|
275
296
|
*/
|
|
276
297
|
function mergeHostedGrants(policy, document) {
|
|
277
298
|
if (document === null || document.grants.length === 0) return {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { i as headersFrom, n as firstHeader, t as fetchRequest } from "./http-
|
|
1
|
+
import { i as headersFrom, n as firstHeader, t as fetchRequest } from "./http-DKLXrFGk.js";
|
|
2
2
|
//#region src/node/http.ts
|
|
3
3
|
function toRequest(req, stream = req) {
|
|
4
4
|
const host = firstHeader(req.headers.host) ?? "localhost";
|
|
@@ -9,9 +9,9 @@ function chunkOf(chunk) {
|
|
|
9
9
|
return typeof chunk === "string" ? Buffer.from(chunk) : new Uint8Array(chunk);
|
|
10
10
|
}
|
|
11
11
|
/**
|
|
12
|
-
* Pull-based with `highWaterMark: 0`: nothing is read from `req` until the
|
|
13
|
-
*
|
|
14
|
-
*
|
|
12
|
+
* Pull-based with `highWaterMark: 0`: nothing is read from `req` until the Web
|
|
13
|
+
* body is consumed, so a later body parser (multer, `express.json()`) still
|
|
14
|
+
* sees the whole stream.
|
|
15
15
|
*/
|
|
16
16
|
function incomingBody(req) {
|
|
17
17
|
return new ReadableStream({ pull(controller) {
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
//#region src/server/http.ts
|
|
2
|
-
/**
|
|
2
|
+
/**
|
|
3
|
+
* Node-style headers (`IncomingHttpHeaders`, Fastify's) as Fetch `Headers`;
|
|
4
|
+
* repeated values stay separate.
|
|
5
|
+
*/
|
|
3
6
|
function headersFrom(source) {
|
|
4
7
|
const headers = new Headers();
|
|
5
8
|
for (const [key, value] of Object.entries(source)) {
|
|
@@ -16,9 +19,9 @@ function firstHeader(value) {
|
|
|
16
19
|
return value?.[0];
|
|
17
20
|
}
|
|
18
21
|
/**
|
|
19
|
-
* A body a framework already parsed, as the text a Fetch `Request` carries.
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
+
* A body a framework already parsed, as the text a Fetch `Request` carries. A
|
|
23
|
+
* non-string body is serialised as JSON and, without a `content-type`, labelled
|
|
24
|
+
* `application/json` on `headers`.
|
|
22
25
|
*/
|
|
23
26
|
function parsedBody(body, headers) {
|
|
24
27
|
if (body === void 0) return;
|
|
@@ -27,8 +30,8 @@ function parsedBody(body, headers) {
|
|
|
27
30
|
return JSON.stringify(body);
|
|
28
31
|
}
|
|
29
32
|
/**
|
|
30
|
-
* A Fetch `Request` for a framework request. A `GET` or `HEAD` carries no
|
|
31
|
-
*
|
|
33
|
+
* A Fetch `Request` for a framework request. A `GET` or `HEAD` carries no body;
|
|
34
|
+
* otherwise the body the framework parsed, or else `stream()`.
|
|
32
35
|
*/
|
|
33
36
|
function fetchRequest(url, method, headers, body, stream) {
|
|
34
37
|
if (method === "GET" || method === "HEAD") return new Request(url, {
|
|
@@ -64,7 +67,10 @@ function requestFromContext(context) {
|
|
|
64
67
|
if ("request" in context && context.request instanceof Request) return context.request;
|
|
65
68
|
if ("req" in context && context.req instanceof Request) return context.req;
|
|
66
69
|
}
|
|
67
|
-
/**
|
|
70
|
+
/**
|
|
71
|
+
* Whether the caller sent credentials, which turns a `401` into a
|
|
72
|
+
* `WWW-Authenticate` challenge.
|
|
73
|
+
*/
|
|
68
74
|
function hasCredentials(request) {
|
|
69
75
|
return request instanceof Request ? request.headers.has("authorization") : request.headers.authorization !== void 0;
|
|
70
76
|
}
|
|
@@ -1,15 +1,18 @@
|
|
|
1
1
|
import { t as timeoutSignal } from "./timeout-D51niuQP.js";
|
|
2
|
-
import { a as describeError, n as CliError } from "./errors-
|
|
3
|
-
import { s as cliVersion } from "./version-
|
|
4
|
-
import "./device-
|
|
2
|
+
import { a as describeError, n as CliError } from "./errors-Vpu6rKHl.js";
|
|
3
|
+
import { s as cliVersion } from "./version-DMQ0dnN5.js";
|
|
4
|
+
import "./device-BwbJNmb2.js";
|
|
5
5
|
//#region src/cli/core/http.ts
|
|
6
|
-
/**
|
|
6
|
+
/**
|
|
7
|
+
* `permdock-cli/<version> node/<version> <platform>`, sent on every request the
|
|
8
|
+
* CLI makes.
|
|
9
|
+
*/
|
|
7
10
|
function userAgent() {
|
|
8
11
|
return `permdock-cli/${cliVersion()} node/${process.versions.node} ${process.platform}`;
|
|
9
12
|
}
|
|
10
13
|
/**
|
|
11
|
-
* Every outbound request: the user agent, a timeout joined to the run's
|
|
12
|
-
*
|
|
14
|
+
* Every outbound request: the user agent, a timeout joined to the run's abort
|
|
15
|
+
* signal, and a `network_error` CLI error when nothing answers.
|
|
13
16
|
*/
|
|
14
17
|
async function httpRequest(io, request) {
|
|
15
18
|
const fetchImpl = io.fetch ?? globalThis.fetch.bind(globalThis);
|
|
@@ -31,8 +34,8 @@ async function httpRequest(io, request) {
|
|
|
31
34
|
}
|
|
32
35
|
}
|
|
33
36
|
/**
|
|
34
|
-
* A 401 or 403 as an `auth_required` action: the credential is missing,
|
|
35
|
-
*
|
|
37
|
+
* A 401 or 403 as an `auth_required` action: the credential is missing, expired
|
|
38
|
+
* or lacks a scope, and `next` says how to get one.
|
|
36
39
|
*/
|
|
37
40
|
function authFailure(response, message, next) {
|
|
38
41
|
if (response.status !== 401 && response.status !== 403) return;
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { r as isRecord } from "./compact-CAf557ZB.js";
|
|
2
|
-
import { i as configError, u as usageResult } from "./errors-
|
|
3
|
-
import { s as writeFileEnsuringDir } from "./files-
|
|
4
|
-
import { r as escapeSqlIdent, s as quoteSqlLiteral } from "./sql-
|
|
5
|
-
import { C as parseMembershipsFlag, r as HELPERS } from "./shared-
|
|
6
|
-
import {
|
|
7
|
-
import { t as FIELD_VIEWS } from "./fields-
|
|
8
|
-
import { n as emptySchema, r as isSchemaKind, t as emitPermissionsModule } from "./generate-
|
|
2
|
+
import { i as configError, u as usageResult } from "./errors-Vpu6rKHl.js";
|
|
3
|
+
import { s as writeFileEnsuringDir } from "./files-BSjrtIHw.js";
|
|
4
|
+
import { r as escapeSqlIdent, s as quoteSqlLiteral } from "./sql-0WjxIp9g.js";
|
|
5
|
+
import { C as parseMembershipsFlag, r as HELPERS } from "./shared-Afctg7B0.js";
|
|
6
|
+
import { n as pgConnector } from "./pg-DQTqRrou.js";
|
|
7
|
+
import { t as FIELD_VIEWS } from "./fields-D0vUI6dq.js";
|
|
8
|
+
import { n as emptySchema, r as isSchemaKind, t as emitPermissionsModule } from "./generate-CezbCaTI.js";
|
|
9
9
|
import { existsSync, readFileSync } from "node:fs";
|
|
10
10
|
import { resolve } from "node:path";
|
|
11
11
|
import { createHash } from "node:crypto";
|
|
@@ -42,7 +42,10 @@ function funcName(value) {
|
|
|
42
42
|
if (!Array.isArray(names) || names.length === 0) return;
|
|
43
43
|
return names.map((item) => stringVal(item) ?? "").join(".");
|
|
44
44
|
}
|
|
45
|
-
/**
|
|
45
|
+
/**
|
|
46
|
+
* The expression of a scalar `(select <expr>)`, the InitPlan form generate
|
|
47
|
+
* writes.
|
|
48
|
+
*/
|
|
46
49
|
function scalarSubselect(value) {
|
|
47
50
|
const targets = asNode$1(asNode$1(asNode$1(asNode$1(unwrap(value))?.["SubLink"])?.["subselect"])?.["SelectStmt"])?.["targetList"];
|
|
48
51
|
if (!Array.isArray(targets) || targets[0] === void 0) return;
|
|
@@ -175,7 +178,7 @@ async function fingerprintSql(sql) {
|
|
|
175
178
|
const deparsed = await deparse(parsed);
|
|
176
179
|
return createHash("sha256").update(deparsed).digest("hex").slice(0, 16);
|
|
177
180
|
} catch {
|
|
178
|
-
return createHash("sha256").update(sql.replaceAll(/\s+/
|
|
181
|
+
return createHash("sha256").update(sql.replaceAll(/\s+/gu, " ").trim().toLowerCase()).digest("hex").slice(0, 16);
|
|
179
182
|
}
|
|
180
183
|
}
|
|
181
184
|
function nodeStmt(first) {
|
|
@@ -192,7 +195,10 @@ function jwtClaim(value) {
|
|
|
192
195
|
const claim = constValue(expr["rexpr"]);
|
|
193
196
|
return typeof claim === "string" ? claim : void 0;
|
|
194
197
|
}
|
|
195
|
-
/**
|
|
198
|
+
/**
|
|
199
|
+
* `auth.jwt()` / `auth.session()`, bare or as a scalar `(select …)`; a column's
|
|
200
|
+
* `->>` is row data, not a claim.
|
|
201
|
+
*/
|
|
196
202
|
function isJwtCall(value) {
|
|
197
203
|
const inner = scalarSubselect(value);
|
|
198
204
|
if (inner !== void 0) return isJwtCall(inner);
|
|
@@ -203,20 +209,15 @@ function isJwtCall(value) {
|
|
|
203
209
|
//#region src/cli/rls/import-membership.ts
|
|
204
210
|
/**
|
|
205
211
|
* What the `where` of a membership subquery on `table` says, or `undefined`
|
|
206
|
-
* when any part of it cannot be read as one. A subquery imports as
|
|
207
|
-
*
|
|
208
|
-
*
|
|
209
|
-
*
|
|
212
|
+
* when any part of it cannot be read as one. A subquery imports as `memberOf`
|
|
213
|
+
* only when it binds the membership row to the signed-in user and to the policy
|
|
214
|
+
* row, and filters roles with string literals at most: a predicate left unread
|
|
215
|
+
* would widen the imported condition.
|
|
210
216
|
*/
|
|
211
217
|
function membershipRoles(subquery, table) {
|
|
212
218
|
const where = selectWhere(subquery.select);
|
|
213
219
|
if (where === void 0) return;
|
|
214
|
-
const scopeColumns = new Set([
|
|
215
|
-
...Object.values(table.columns ?? {}),
|
|
216
|
-
table.tenant,
|
|
217
|
-
table.team,
|
|
218
|
-
table.id
|
|
219
|
-
].filter((column) => column !== void 0));
|
|
220
|
+
const scopeColumns = new Set([...Object.values(table.columns ?? {}), table.id].filter((column) => column !== void 0));
|
|
220
221
|
if (subquery.field !== void 0 && !scopeColumns.has(selectTarget(subquery.select) ?? "")) return;
|
|
221
222
|
const roleColumn = typeof table.role === "string" ? table.role : void 0;
|
|
222
223
|
const roles = [];
|
|
@@ -393,7 +394,10 @@ function helperCall(value) {
|
|
|
393
394
|
} : void 0;
|
|
394
395
|
}
|
|
395
396
|
const MEMBER = /^member_([a-z][a-z0-9_]*)_ids$/u;
|
|
396
|
-
/**
|
|
397
|
+
/**
|
|
398
|
+
* `col in (select member_<scope>_ids())`: any live membership of the row's
|
|
399
|
+
* instance.
|
|
400
|
+
*/
|
|
397
401
|
function memberCall(value) {
|
|
398
402
|
const sub = asNode$1(asNode$1(unwrap(value))?.["SubLink"]);
|
|
399
403
|
const kind = sub?.["subLinkType"];
|
|
@@ -442,8 +446,8 @@ function helperCalls(conjunct) {
|
|
|
442
446
|
/**
|
|
443
447
|
* The role structure of a policy that calls the helpers: each OR branch's
|
|
444
448
|
* helper calls become grants (roles from the `role_permissions` seeds), the
|
|
445
|
-
* branch's other conjuncts become their `where`. Restrictive policies are
|
|
446
|
-
*
|
|
449
|
+
* branch's other conjuncts become their `where`. Restrictive policies are read
|
|
450
|
+
* through their outer `not`.
|
|
447
451
|
*/
|
|
448
452
|
async function helperGrants(sql, memberships, functions, seeds) {
|
|
449
453
|
if (sql === void 0) return [];
|
|
@@ -480,10 +484,10 @@ async function helperGrants(sql, memberships, functions, seeds) {
|
|
|
480
484
|
else rest.push(mapped);
|
|
481
485
|
}
|
|
482
486
|
if (calls.length === 0) continue;
|
|
483
|
-
const condition =
|
|
487
|
+
const condition = portable ? rest.length === 0 ? void 0 : rest.length === 1 ? rest[0] : {
|
|
484
488
|
op: "and",
|
|
485
489
|
conditions: rest
|
|
486
|
-
};
|
|
490
|
+
} : unportable;
|
|
487
491
|
for (const call of calls) {
|
|
488
492
|
const permission = seeds.find((seed) => seed.grantKey === call.key)?.permission ?? call.key.replace(/#[a-z0-9][a-z0-9_-]*$/u, "");
|
|
489
493
|
grants.push({
|
|
@@ -543,10 +547,7 @@ function mapNode(value, ctx) {
|
|
|
543
547
|
const subquery = membershipSubquery(node);
|
|
544
548
|
if (subquery !== void 0) {
|
|
545
549
|
const { table } = subquery;
|
|
546
|
-
const
|
|
547
|
-
if (memberships?.tenant !== void 0) mappedScopes.push(["tenant", memberships.tenant]);
|
|
548
|
-
if (memberships?.team !== void 0) mappedScopes.push(["team", memberships.team]);
|
|
549
|
-
const matches = mappedScopes.filter(([, mapped]) => mapped.table === table);
|
|
550
|
+
const matches = Object.entries(memberships?.scopes ?? {}).filter(([, mapped]) => mapped.table === table);
|
|
550
551
|
if (matches.length > 0) {
|
|
551
552
|
for (const [scope, mapped] of matches) {
|
|
552
553
|
const read = membershipRoles(subquery, mapped);
|
|
@@ -631,7 +632,10 @@ function seedFromRow(row) {
|
|
|
631
632
|
effect: row["effect"] === "deny" ? "deny" : "allow"
|
|
632
633
|
};
|
|
633
634
|
}
|
|
634
|
-
/**
|
|
635
|
+
/**
|
|
636
|
+
* `role_permissions` rows from the `insert ... values` statements of a SQL
|
|
637
|
+
* dump.
|
|
638
|
+
*/
|
|
635
639
|
async function seedsFromSql(sql) {
|
|
636
640
|
let parsed;
|
|
637
641
|
try {
|
|
@@ -754,7 +758,10 @@ function sourceOf(select) {
|
|
|
754
758
|
companion: right
|
|
755
759
|
};
|
|
756
760
|
}
|
|
757
|
-
/**
|
|
761
|
+
/**
|
|
762
|
+
* A mask is `allow`, `not deny` or `allow and not deny`; the generator puts the
|
|
763
|
+
* deny last.
|
|
764
|
+
*/
|
|
758
765
|
function splitMask(mask) {
|
|
759
766
|
const bool = asNode(asNode(mask)?.["BoolExpr"]);
|
|
760
767
|
if (bool?.["boolop"] === "NOT_EXPR") return { deny: list(bool["args"])[0] };
|
|
@@ -778,9 +785,9 @@ async function grantsOf(node, memberships, functions, seeds) {
|
|
|
778
785
|
}
|
|
779
786
|
/**
|
|
780
787
|
* Reads back the field views `rls generate --fields views` writes: a
|
|
781
|
-
* `security_invoker` `<table>_visible` whose restricted columns are
|
|
782
|
-
*
|
|
783
|
-
*
|
|
788
|
+
* `security_invoker` `<table>_visible` whose restricted columns are `case when
|
|
789
|
+
* <mask> then col end`, either inline or through the `<table>_visible_fields`
|
|
790
|
+
* companion it joins. Other views are ignored.
|
|
784
791
|
*/
|
|
785
792
|
async function fieldViewsFromSql(sql, memberships, functions, seeds) {
|
|
786
793
|
let stmts;
|
|
@@ -830,7 +837,10 @@ async function fieldViewsFromSql(sql, memberships, functions, seeds) {
|
|
|
830
837
|
return out;
|
|
831
838
|
}
|
|
832
839
|
const quote = escapeSqlIdent;
|
|
833
|
-
/**
|
|
840
|
+
/**
|
|
841
|
+
* `create view` statements for every view in the database, from
|
|
842
|
+
* `pg_get_viewdef` and the view's options.
|
|
843
|
+
*/
|
|
834
844
|
async function viewsSqlFromDb(query) {
|
|
835
845
|
return (await query(`select n.nspname as schema, c.relname as name, c.reloptions as options, pg_get_viewdef(c.oid) as definition
|
|
836
846
|
from pg_class c join pg_namespace n on n.oid = c.relnamespace
|
|
@@ -845,9 +855,9 @@ async function viewsSqlFromDb(query) {
|
|
|
845
855
|
}
|
|
846
856
|
//#endregion
|
|
847
857
|
//#region src/cli/rls/import.ts
|
|
848
|
-
const POLICY_RE = /create\s+policy\s+"?([A-Za-z0-9_]+)"?\s+on\s+"?([A-Za-z0-9_]+)"?([\s\S]*?);/
|
|
858
|
+
const POLICY_RE = /create\s+policy\s+"?([A-Za-z0-9_]+)"?\s+on\s+"?([A-Za-z0-9_]+)"?([\s\S]*?);/giu;
|
|
849
859
|
function extractParenClause(sql, keyword) {
|
|
850
|
-
const match = new RegExp(`\\b${keyword}\\s*\\(`, "
|
|
860
|
+
const match = new RegExp(`\\b${keyword}\\s*\\(`, "iu").exec(sql);
|
|
851
861
|
if (match?.index === void 0) return;
|
|
852
862
|
const start = match.index + match[0].length;
|
|
853
863
|
let depth = 1;
|
|
@@ -866,11 +876,11 @@ function splitPolicies(sql) {
|
|
|
866
876
|
const name = match[1] ?? "policy";
|
|
867
877
|
const table = match[2] ?? "table";
|
|
868
878
|
const body = match[3] ?? "";
|
|
869
|
-
const clauses = body.search(/\b(?:using|with\s+check)\s*\(/
|
|
879
|
+
const clauses = body.search(/\b(?:using|with\s+check)\s*\(/iu);
|
|
870
880
|
const header = clauses === -1 ? body : body.slice(0, clauses);
|
|
871
|
-
const asRestrictive = /\bas\s+restrictive\b/
|
|
872
|
-
const cmdMatch = /\bfor\s+(all|select|insert|update|delete)\b/
|
|
873
|
-
const toMatch = /\bto\s+([^\n]+)/
|
|
881
|
+
const asRestrictive = /\bas\s+restrictive\b/iu.test(header);
|
|
882
|
+
const cmdMatch = /\bfor\s+(all|select|insert|update|delete)\b/iu.exec(header);
|
|
883
|
+
const toMatch = /\bto\s+([^\n]+)/iu.exec(header);
|
|
874
884
|
const using = extractParenClause(body, "using");
|
|
875
885
|
const check = extractParenClause(body, "with\\s+check");
|
|
876
886
|
const roles = (toMatch?.[1] ?? "authenticated").split(",").map((item) => item.trim()).filter((item) => item !== "");
|
|
@@ -922,7 +932,7 @@ function emitGenerated(catalog, fieldViews, schema) {
|
|
|
922
932
|
resources: tables.map((table) => {
|
|
923
933
|
const { actions, collection } = actionsFor(catalog.filter((item) => item.table === table).map((item) => item.cmd));
|
|
924
934
|
return {
|
|
925
|
-
path: [table.replaceAll(/[^A-Za-z0-9_]/
|
|
935
|
+
path: [table.replaceAll(/[^A-Za-z0-9_]/gu, "_")],
|
|
926
936
|
schema: emptySchema(kind),
|
|
927
937
|
actions,
|
|
928
938
|
collection
|
|
@@ -931,7 +941,7 @@ function emitGenerated(catalog, fieldViews, schema) {
|
|
|
931
941
|
});
|
|
932
942
|
}
|
|
933
943
|
function assertNoServiceRole(sql) {
|
|
934
|
-
if (/\bto\s+service_role\b|\bfrom\s+service_role\b/
|
|
944
|
+
if (/\bto\s+service_role\b|\bfrom\s+service_role\b/iu.test(sql)) throw configError("PermDock CLI: imported SQL must never target service_role");
|
|
935
945
|
}
|
|
936
946
|
async function seedsFromDb(query) {
|
|
937
947
|
const schema = (await query(`select table_schema from information_schema.tables where table_name = 'role_permissions' order by table_schema = 'permdock' desc, table_schema = 'public' desc, table_schema limit 1`)).rows[0]?.["table_schema"];
|
|
@@ -945,10 +955,13 @@ async function seedsFromDb(query) {
|
|
|
945
955
|
return [];
|
|
946
956
|
}
|
|
947
957
|
}
|
|
948
|
-
/**
|
|
958
|
+
/**
|
|
959
|
+
* `pg_policies.roles` is a `name[]`, which `pg` returns as an array or,
|
|
960
|
+
* untyped, as `{a,b}`.
|
|
961
|
+
*/
|
|
949
962
|
function policyRoles(value) {
|
|
950
963
|
if (Array.isArray(value)) return value.map(String);
|
|
951
|
-
return typeof value === "string" ? value.replaceAll(/[{}]/
|
|
964
|
+
return typeof value === "string" ? value.replaceAll(/[{}]/gu, "").split(",").map((item) => item.trim()).filter((item) => item !== "") : [];
|
|
952
965
|
}
|
|
953
966
|
async function policiesFromDb(db, connect) {
|
|
954
967
|
const client = await connect(db);
|
|
@@ -1011,7 +1024,11 @@ async function runRlsImport(input) {
|
|
|
1011
1024
|
seeds = await seedsFromSql(sql);
|
|
1012
1025
|
policies = splitPolicies(await canonicalDump(sql) ?? sql);
|
|
1013
1026
|
if (policies.length === 0) policies = splitPolicies(sql);
|
|
1014
|
-
} else if (input.db
|
|
1027
|
+
} else if (input.db === void 0) return {
|
|
1028
|
+
code: 2,
|
|
1029
|
+
output: "PermDock CLI: rls import needs --sql <file> or a database: --db-url-stdin, DATABASE_URL or SUPABASE_DB_URL"
|
|
1030
|
+
};
|
|
1031
|
+
else try {
|
|
1015
1032
|
const fromDb = await policiesFromDb(input.db, input.connect ?? pgConnector("permdock rls import --db-url-stdin", input.cwd));
|
|
1016
1033
|
policies = fromDb.policies;
|
|
1017
1034
|
bodies = fromDb.bodies;
|
|
@@ -1020,10 +1037,6 @@ async function runRlsImport(input) {
|
|
|
1020
1037
|
} catch (cause) {
|
|
1021
1038
|
return usageResult(cause);
|
|
1022
1039
|
}
|
|
1023
|
-
else return {
|
|
1024
|
-
code: 2,
|
|
1025
|
-
output: "PermDock CLI: rls import needs --sql <file> or a database: --db-url-stdin, DATABASE_URL or SUPABASE_DB_URL"
|
|
1026
|
-
};
|
|
1027
1040
|
const memberships = parseMembershipsFlag(input.memberships) ?? input.config.rls?.memberships;
|
|
1028
1041
|
const roleValues = input.config.rls?.roleValues;
|
|
1029
1042
|
if (roleValues !== void 0) seeds = seeds.map((row) => {
|
|
@@ -1070,7 +1083,7 @@ function fieldViewHint(view) {
|
|
|
1070
1083
|
return `field view ${view.view} over ${view.table}: ${view.restricted.map((item) => item.column).join(", ")} are field-limited; set fields on the read grants that list them (fieldViews export)`;
|
|
1071
1084
|
}
|
|
1072
1085
|
function membershipHint(table) {
|
|
1073
|
-
return [`exists over ${table} stayed opaque; if it holds memberships, map it in permdock.config.ts:`, `// rls: { memberships: { tenant: { table: '${table}', user: 'user_id', tenant: 'tenant_id', role: 'role' } } }`].join("\n");
|
|
1086
|
+
return [`exists over ${table} stayed opaque; if it holds memberships, map it in permdock.config.ts:`, `// rls: { memberships: { scopes: { tenant: { table: '${table}', user: 'user_id', columns: { tenant: 'tenant_id' }, role: 'role' } } } }`].join("\n");
|
|
1074
1087
|
}
|
|
1075
1088
|
function uniqueHints(names, bodies) {
|
|
1076
1089
|
const lines = [];
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { r as isRecord } from "./compact-CAf557ZB.js";
|
|
2
|
-
import { t as byCodePoint } from "./compare-
|
|
3
|
-
import { i as readJsonFile } from "./files-
|
|
4
|
-
import { t as applyFiles } from "./files-
|
|
5
|
-
import { n as httpRequest } from "./http-
|
|
6
|
-
import { i as schemaExpression, t as emitPermissionsModule } from "./generate-
|
|
7
|
-
import { t as validateOpenapi } from "./schema-
|
|
2
|
+
import { t as byCodePoint } from "./compare-DTfyUunF.js";
|
|
3
|
+
import { i as readJsonFile } from "./files-BSjrtIHw.js";
|
|
4
|
+
import { t as applyFiles } from "./files-B3AA05f1.js";
|
|
5
|
+
import { n as httpRequest } from "./http-DOL33cO0.js";
|
|
6
|
+
import { i as schemaExpression, t as emitPermissionsModule } from "./generate-CezbCaTI.js";
|
|
7
|
+
import { t as validateOpenapi } from "./schema-Dst9I9Gs.js";
|
|
8
8
|
import { existsSync, readFileSync } from "node:fs";
|
|
9
9
|
import { resolve } from "node:path";
|
|
10
10
|
//#region ../../node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/browser/dist/nodes/identity.js
|